From 458d3d6ce110b40753bf7f1efb673e918d63c5c9 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Sat, 22 Mar 2025 10:24:31 +0800 Subject: [PATCH] feat: add solutions to lc problems: No.0252,0253 * No.0252.Meeting Rooms * No.0253.Meeting Rooms II --- .../0200-0299/0252.Meeting Rooms/README.md | 39 +-- .../0200-0299/0252.Meeting Rooms/README_EN.md | 43 +-- .../0200-0299/0252.Meeting Rooms/Solution.cpp | 6 +- .../0252.Meeting Rooms/Solution.java | 6 +- .../0200-0299/0252.Meeting Rooms/Solution.rs | 27 +- .../0200-0299/0253.Meeting Rooms II/README.md | 304 +++++++++++++---- .../0253.Meeting Rooms II/README_EN.md | 306 ++++++++++++++---- .../0253.Meeting Rooms II/Solution.cpp | 23 +- .../0253.Meeting Rooms II/Solution.go | 25 +- .../0253.Meeting Rooms II/Solution.java | 25 +- .../0253.Meeting Rooms II/Solution.py | 15 +- .../0253.Meeting Rooms II/Solution.rs | 42 +-- .../0253.Meeting Rooms II/Solution.ts | 14 + .../0253.Meeting Rooms II/Solution2.cpp | 16 + .../0253.Meeting Rooms II/Solution2.go | 20 ++ .../0253.Meeting Rooms II/Solution2.java | 15 + .../0253.Meeting Rooms II/Solution2.py | 11 + .../0253.Meeting Rooms II/Solution2.rs | 24 ++ .../0253.Meeting Rooms II/Solution2.ts | 17 + 19 files changed, 709 insertions(+), 269 deletions(-) create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution.ts create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.cpp create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.go create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.java create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.py create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.rs create mode 100644 solution/0200-0299/0253.Meeting Rooms II/Solution2.ts diff --git a/solution/0200-0299/0252.Meeting Rooms/README.md b/solution/0200-0299/0252.Meeting Rooms/README.md index db5c3a47d17bf..6b44b73110318 100644 --- a/solution/0200-0299/0252.Meeting Rooms/README.md +++ b/solution/0200-0299/0252.Meeting Rooms/README.md @@ -53,9 +53,9 @@ tags: ### 方法一:排序 -我们将会议按照开始时间进行排序,然后遍历排序后的会议,如果当前会议的开始时间小于前一个会议的结束时间,则说明两个会议有重叠,返回 `false` 即可。 +我们将会议按照开始时间进行排序,然后遍历排序后的会议,如果当前会议的开始时间小于前一个会议的结束时间,则说明两个会议有重叠,返回 $\text{false}$,否则继续遍历。 -遍历结束后,返回 `true`。 +如果遍历结束都没有发现重叠的会议,则返回 $\text{true}$。 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为会议数量。 @@ -77,9 +77,7 @@ class Solution { public boolean canAttendMeetings(int[][] intervals) { Arrays.sort(intervals, (a, b) -> a[0] - b[0]); for (int i = 1; i < intervals.length; ++i) { - var a = intervals[i - 1]; - var b = intervals[i]; - if (a[1] > b[0]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } @@ -94,11 +92,11 @@ class Solution { class Solution { public: bool canAttendMeetings(vector>& intervals) { - sort(intervals.begin(), intervals.end(), [](const vector& a, const vector& b) { + ranges::sort(intervals, [](const auto& a, const auto& b) { return a[0] < b[0]; }); for (int i = 1; i < intervals.size(); ++i) { - if (intervals[i][0] < intervals[i - 1][1]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } @@ -141,32 +139,13 @@ function canAttendMeetings(intervals: number[][]): boolean { ```rust impl Solution { - #[allow(dead_code)] - pub fn can_attend_meetings(intervals: Vec>) -> bool { - if intervals.len() == 1 { - return true; - } - - let mut intervals = intervals; - - // Sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); - - let mut end = -1; - - // Begin traverse - for p in &intervals { - if end == -1 { - // This is the first pair - end = p[1]; - continue; - } - if p[0] < end { + pub fn can_attend_meetings(mut intervals: Vec>) -> bool { + intervals.sort_by(|a, b| a[0].cmp(&b[0])); + for i in 1..intervals.len() { + if intervals[i - 1][1] > intervals[i][0] { return false; } - end = p[1]; } - true } } diff --git a/solution/0200-0299/0252.Meeting Rooms/README_EN.md b/solution/0200-0299/0252.Meeting Rooms/README_EN.md index e052d217a0a34..3553a9ea56eee 100644 --- a/solution/0200-0299/0252.Meeting Rooms/README_EN.md +++ b/solution/0200-0299/0252.Meeting Rooms/README_EN.md @@ -42,7 +42,13 @@ tags: -### Solution 1 +### Solution 1: Sorting + +We sort the meetings based on their start times, and then iterate through the sorted meetings. If the start time of the current meeting is less than the end time of the previous meeting, it indicates that there is an overlap between the two meetings, and we return `false`. Otherwise, we continue iterating. + +If no overlap is found by the end of the iteration, we return `true`. + +The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$, where $n$ is the number of meetings. @@ -62,9 +68,7 @@ class Solution { public boolean canAttendMeetings(int[][] intervals) { Arrays.sort(intervals, (a, b) -> a[0] - b[0]); for (int i = 1; i < intervals.length; ++i) { - var a = intervals[i - 1]; - var b = intervals[i]; - if (a[1] > b[0]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } @@ -79,11 +83,11 @@ class Solution { class Solution { public: bool canAttendMeetings(vector>& intervals) { - sort(intervals.begin(), intervals.end(), [](const vector& a, const vector& b) { + ranges::sort(intervals, [](const auto& a, const auto& b) { return a[0] < b[0]; }); for (int i = 1; i < intervals.size(); ++i) { - if (intervals[i][0] < intervals[i - 1][1]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } @@ -126,32 +130,13 @@ function canAttendMeetings(intervals: number[][]): boolean { ```rust impl Solution { - #[allow(dead_code)] - pub fn can_attend_meetings(intervals: Vec>) -> bool { - if intervals.len() == 1 { - return true; - } - - let mut intervals = intervals; - - // Sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); - - let mut end = -1; - - // Begin traverse - for p in &intervals { - if end == -1 { - // This is the first pair - end = p[1]; - continue; - } - if p[0] < end { + pub fn can_attend_meetings(mut intervals: Vec>) -> bool { + intervals.sort_by(|a, b| a[0].cmp(&b[0])); + for i in 1..intervals.len() { + if intervals[i - 1][1] > intervals[i][0] { return false; } - end = p[1]; } - true } } diff --git a/solution/0200-0299/0252.Meeting Rooms/Solution.cpp b/solution/0200-0299/0252.Meeting Rooms/Solution.cpp index 7e6b6657fe2e5..9fca6aeed42e3 100644 --- a/solution/0200-0299/0252.Meeting Rooms/Solution.cpp +++ b/solution/0200-0299/0252.Meeting Rooms/Solution.cpp @@ -1,14 +1,14 @@ class Solution { public: bool canAttendMeetings(vector>& intervals) { - sort(intervals.begin(), intervals.end(), [](const vector& a, const vector& b) { + ranges::sort(intervals, [](const auto& a, const auto& b) { return a[0] < b[0]; }); for (int i = 1; i < intervals.size(); ++i) { - if (intervals[i][0] < intervals[i - 1][1]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } return true; } -}; \ No newline at end of file +}; diff --git a/solution/0200-0299/0252.Meeting Rooms/Solution.java b/solution/0200-0299/0252.Meeting Rooms/Solution.java index 565b05b05f2f8..008f531dfad17 100644 --- a/solution/0200-0299/0252.Meeting Rooms/Solution.java +++ b/solution/0200-0299/0252.Meeting Rooms/Solution.java @@ -2,12 +2,10 @@ class Solution { public boolean canAttendMeetings(int[][] intervals) { Arrays.sort(intervals, (a, b) -> a[0] - b[0]); for (int i = 1; i < intervals.length; ++i) { - var a = intervals[i - 1]; - var b = intervals[i]; - if (a[1] > b[0]) { + if (intervals[i - 1][1] > intervals[i][0]) { return false; } } return true; } -} \ No newline at end of file +} diff --git a/solution/0200-0299/0252.Meeting Rooms/Solution.rs b/solution/0200-0299/0252.Meeting Rooms/Solution.rs index 1ee4bd2d2cc4a..a81f3d2fc39a5 100644 --- a/solution/0200-0299/0252.Meeting Rooms/Solution.rs +++ b/solution/0200-0299/0252.Meeting Rooms/Solution.rs @@ -1,30 +1,11 @@ impl Solution { - #[allow(dead_code)] - pub fn can_attend_meetings(intervals: Vec>) -> bool { - if intervals.len() == 1 { - return true; - } - - let mut intervals = intervals; - - // Sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); - - let mut end = -1; - - // Begin traverse - for p in &intervals { - if end == -1 { - // This is the first pair - end = p[1]; - continue; - } - if p[0] < end { + pub fn can_attend_meetings(mut intervals: Vec>) -> bool { + intervals.sort_by(|a, b| a[0].cmp(&b[0])); + for i in 1..intervals.len() { + if intervals[i - 1][1] > intervals[i][0] { return false; } - end = p[1]; } - true } } diff --git a/solution/0200-0299/0253.Meeting Rooms II/README.md b/solution/0200-0299/0253.Meeting Rooms II/README.md index c330c2024b93d..72e3b0353c53f 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/README.md +++ b/solution/0200-0299/0253.Meeting Rooms II/README.md @@ -56,6 +56,169 @@ tags: ### 方法一:差分数组 +我们可以用差分数组来实现。 + +我们首先找到所有会议的最大结束时间,记为 $m$,然后创建一个长度为 $m + 1$ 的差分数组 $d$,将每个会议的开始时间和结束时间分别加到差分数组的对应位置上,即 $d[l] = d[l] + 1$,而 $d[r] = d[r] - 1$。 + +然后,我们计算差分数组的前缀和,找出前缀和的最大值,即为所需会议室的最小数量。 + +时间复杂度 $O(n + m)$,空间复杂度 $O(m)$。其中 $n$ 和 $m$ 分别为会议数量和最大结束时间。 + + + +#### Python3 + +```python +class Solution: + def minMeetingRooms(self, intervals: List[List[int]]) -> int: + m = max(e[1] for e in intervals) + d = [0] * (m + 1) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for v in d: + s += v + ans = max(ans, s) + return ans +``` + +#### Java + +```java +class Solution { + public int minMeetingRooms(int[][] intervals) { + int m = 0; + for (var e : intervals) { + m = Math.max(m, e[1]); + } + int[] d = new int[m + 1]; + for (var e : intervals) { + ++d[e[0]]; + --d[e[1]]; + } + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = Math.max(ans, s); + } + return ans; + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + int minMeetingRooms(vector>& intervals) { + int m = 0; + for (const auto& e : intervals) { + m = max(m, e[1]); + } + vector d(m + 1); + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; + } + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = max(ans, s); + } + return ans; + } +}; +``` + +#### Go + +```go +func minMeetingRooms(intervals [][]int) (ans int) { + m := 0 + for _, e := range intervals { + m = max(m, e[1]) + } + + d := make([]int, m+1) + for _, e := range intervals { + d[e[0]]++ + d[e[1]]-- + } + + s := 0 + for _, v := range d { + s += v + ans = max(ans, s) + } + return +} +``` + +#### TypeScript + +```ts +function minMeetingRooms(intervals: number[][]): number { + const m = Math.max(...intervals.map(([_, r]) => r)); + const d: number[] = Array(m + 1).fill(0); + for (const [l, r] of intervals) { + d[l]++; + d[r]--; + } + let [ans, s] = [0, 0]; + for (const v of d) { + s += v; + ans = Math.max(ans, s); + } + return ans; +} +``` + +#### Rust + +```rust +impl Solution { + pub fn min_meeting_rooms(intervals: Vec>) -> i32 { + let mut m = 0; + for e in &intervals { + m = m.max(e[1]); + } + + let mut d = vec![0; (m + 1) as usize]; + for e in intervals { + d[e[0] as usize] += 1; + d[e[1] as usize] -= 1; + } + + let mut ans = 0; + let mut s = 0; + for v in d { + s += v; + ans = ans.max(s); + } + + ans + } +} +``` + + + + + + + +### 方法二:差分(哈希表) + +如果题目中的会议时间跨度很大,那么我们可以使用哈希表来代替差分数组。 + +我们首先创建一个哈希表 $d$,将每个会议的开始时间和结束时间分别加到哈希表的对应位置上,即 $d[l] = d[l] + 1$,而 $d[r] = d[r] - 1$。 + +然后,我们将哈希表按照键进行排序,计算哈希表的前缀和,找出前缀和的最大值,即为所需会议室的最小数量。 + +时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为会议数量。 + #### Python3 @@ -63,11 +226,15 @@ tags: ```python class Solution: def minMeetingRooms(self, intervals: List[List[int]]) -> int: - delta = [0] * 1000010 - for start, end in intervals: - delta[start] += 1 - delta[end] -= 1 - return max(accumulate(delta)) + d = defaultdict(int) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for _, v in sorted(d.items()): + s += v + ans = max(ans, s) + return ans ``` #### Java @@ -75,18 +242,17 @@ class Solution: ```java class Solution { public int minMeetingRooms(int[][] intervals) { - int n = 1000010; - int[] delta = new int[n]; - for (int[] e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + Map d = new TreeMap<>(); + for (var e : intervals) { + d.merge(e[0], 1, Integer::sum); + d.merge(e[1], -1, Integer::sum); } - int res = delta[0]; - for (int i = 1; i < n; ++i) { - delta[i] += delta[i - 1]; - res = Math.max(res, delta[i]); + int ans = 0, s = 0; + for (var e : d.values()) { + s += e; + ans = Math.max(ans, s); } - return res; + return ans; } } ``` @@ -97,16 +263,17 @@ class Solution { class Solution { public: int minMeetingRooms(vector>& intervals) { - int n = 1000010; - vector delta(n); - for (auto e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + map d; + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; } - for (int i = 0; i < n - 1; ++i) { - delta[i + 1] += delta[i]; + int ans = 0, s = 0; + for (auto& [_, v] : d) { + s += v; + ans = max(ans, s); } - return *max_element(delta.begin(), delta.end()); + return ans; } }; ``` @@ -114,56 +281,75 @@ public: #### Go ```go -func minMeetingRooms(intervals [][]int) int { - n := 1000010 - delta := make([]int, n) +func minMeetingRooms(intervals [][]int) (ans int) { + d := make(map[int]int) for _, e := range intervals { - delta[e[0]]++ - delta[e[1]]-- + d[e[0]]++ + d[e[1]]-- + } + + keys := make([]int, 0, len(d)) + for k := range d { + keys = append(keys, k) } - for i := 1; i < n; i++ { - delta[i] += delta[i-1] + sort.Ints(keys) + + s := 0 + for _, k := range keys { + s += d[k] + ans = max(ans, s) } - return slices.Max(delta) + return +} +``` + +#### TypeScript + +```ts +function minMeetingRooms(intervals: number[][]): number { + const d: { [key: number]: number } = {}; + for (const [l, r] of intervals) { + d[l] = (d[l] || 0) + 1; + d[r] = (d[r] || 0) - 1; + } + + let [ans, s] = [0, 0]; + const keys = Object.keys(d) + .map(Number) + .sort((a, b) => a - b); + for (const k of keys) { + s += d[k]; + ans = Math.max(ans, s); + } + return ans; } ``` #### Rust ```rust -use std::{cmp::Reverse, collections::BinaryHeap}; +use std::collections::HashMap; impl Solution { - #[allow(dead_code)] pub fn min_meeting_rooms(intervals: Vec>) -> i32 { - // The min heap that stores the earliest ending time among all meeting rooms - let mut pq = BinaryHeap::new(); - let mut intervals = intervals; - let n = intervals.len(); - - // Let's first sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); - - // Push the first end time to the heap - pq.push(Reverse(intervals[0][1])); - - // Traverse the intervals vector - for i in 1..n { - // Get the current top element from the heap - if let Some(Reverse(end_time)) = pq.pop() { - if end_time <= intervals[i][0] { - // If the end time is early than the current begin time - let new_end_time = intervals[i][1]; - pq.push(Reverse(new_end_time)); - } else { - // Otherwise, push the end time back and we also need a new room - pq.push(Reverse(end_time)); - pq.push(Reverse(intervals[i][1])); - } - } + let mut d: HashMap = HashMap::new(); + for interval in intervals { + let (l, r) = (interval[0], interval[1]); + *d.entry(l).or_insert(0) += 1; + *d.entry(r).or_insert(0) -= 1; + } + + let mut times: Vec = d.keys().cloned().collect(); + times.sort(); + + let mut ans = 0; + let mut s = 0; + for time in times { + s += d[&time]; + ans = ans.max(s); } - pq.len() as i32 + ans } } ``` diff --git a/solution/0200-0299/0253.Meeting Rooms II/README_EN.md b/solution/0200-0299/0253.Meeting Rooms II/README_EN.md index 819e7009ce22e..9065c37a97deb 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/README_EN.md +++ b/solution/0200-0299/0253.Meeting Rooms II/README_EN.md @@ -45,7 +45,170 @@ tags: -### Solution 1 +### Solution 1: Difference Array + +We can implement this using a difference array. + +First, we find the maximum end time of all the meetings, denoted as $m$. Then, we create a difference array $d$ of length $m + 1$. For each meeting, we add to the corresponding positions in the difference array: $d[l] = d[l] + 1$ for the start time, and $d[r] = d[r] - 1$ for the end time. + +Next, we calculate the prefix sum of the difference array and find the maximum value of the prefix sum, which represents the minimum number of meeting rooms required. + +The time complexity is $O(n + m)$ and the space complexity is $O(m)$, where $n$ is the number of meetings and $m$ is the maximum end time. + + + +#### Python3 + +```python +class Solution: + def minMeetingRooms(self, intervals: List[List[int]]) -> int: + m = max(e[1] for e in intervals) + d = [0] * (m + 1) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for v in d: + s += v + ans = max(ans, s) + return ans +``` + +#### Java + +```java +class Solution { + public int minMeetingRooms(int[][] intervals) { + int m = 0; + for (var e : intervals) { + m = Math.max(m, e[1]); + } + int[] d = new int[m + 1]; + for (var e : intervals) { + ++d[e[0]]; + --d[e[1]]; + } + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = Math.max(ans, s); + } + return ans; + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + int minMeetingRooms(vector>& intervals) { + int m = 0; + for (const auto& e : intervals) { + m = max(m, e[1]); + } + vector d(m + 1); + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; + } + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = max(ans, s); + } + return ans; + } +}; +``` + +#### Go + +```go +func minMeetingRooms(intervals [][]int) (ans int) { + m := 0 + for _, e := range intervals { + m = max(m, e[1]) + } + + d := make([]int, m+1) + for _, e := range intervals { + d[e[0]]++ + d[e[1]]-- + } + + s := 0 + for _, v := range d { + s += v + ans = max(ans, s) + } + return +} +``` + +#### TypeScript + +```ts +function minMeetingRooms(intervals: number[][]): number { + const m = Math.max(...intervals.map(([_, r]) => r)); + const d: number[] = Array(m + 1).fill(0); + for (const [l, r] of intervals) { + d[l]++; + d[r]--; + } + let [ans, s] = [0, 0]; + for (const v of d) { + s += v; + ans = Math.max(ans, s); + } + return ans; +} +``` + +#### Rust + +```rust +impl Solution { + pub fn min_meeting_rooms(intervals: Vec>) -> i32 { + let mut m = 0; + for e in &intervals { + m = m.max(e[1]); + } + + let mut d = vec![0; (m + 1) as usize]; + for e in intervals { + d[e[0] as usize] += 1; + d[e[1] as usize] -= 1; + } + + let mut ans = 0; + let mut s = 0; + for v in d { + s += v; + ans = ans.max(s); + } + + ans + } +} +``` + + + + + + + +### Solution 2: Difference (Hash Map) + +If the meeting times span a large range, we can use a hash map instead of a difference array. + +First, we create a hash map $d$, where we add to the corresponding positions for each meeting's start time and end time: $d[l] = d[l] + 1$ for the start time, and $d[r] = d[r] - 1$ for the end time. + +Then, we sort the hash map by its keys, calculate the prefix sum of the hash map, and find the maximum value of the prefix sum, which represents the minimum number of meeting rooms required. + +The time complexity is $O(n \times \log n)$ and the space complexity is $O(n)$, where $n$ is the number of meetings. @@ -54,11 +217,15 @@ tags: ```python class Solution: def minMeetingRooms(self, intervals: List[List[int]]) -> int: - delta = [0] * 1000010 - for start, end in intervals: - delta[start] += 1 - delta[end] -= 1 - return max(accumulate(delta)) + d = defaultdict(int) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for _, v in sorted(d.items()): + s += v + ans = max(ans, s) + return ans ``` #### Java @@ -66,18 +233,17 @@ class Solution: ```java class Solution { public int minMeetingRooms(int[][] intervals) { - int n = 1000010; - int[] delta = new int[n]; - for (int[] e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + Map d = new TreeMap<>(); + for (var e : intervals) { + d.merge(e[0], 1, Integer::sum); + d.merge(e[1], -1, Integer::sum); } - int res = delta[0]; - for (int i = 1; i < n; ++i) { - delta[i] += delta[i - 1]; - res = Math.max(res, delta[i]); + int ans = 0, s = 0; + for (var e : d.values()) { + s += e; + ans = Math.max(ans, s); } - return res; + return ans; } } ``` @@ -88,16 +254,17 @@ class Solution { class Solution { public: int minMeetingRooms(vector>& intervals) { - int n = 1000010; - vector delta(n); - for (auto e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + map d; + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; } - for (int i = 0; i < n - 1; ++i) { - delta[i + 1] += delta[i]; + int ans = 0, s = 0; + for (auto& [_, v] : d) { + s += v; + ans = max(ans, s); } - return *max_element(delta.begin(), delta.end()); + return ans; } }; ``` @@ -105,56 +272,75 @@ public: #### Go ```go -func minMeetingRooms(intervals [][]int) int { - n := 1000010 - delta := make([]int, n) +func minMeetingRooms(intervals [][]int) (ans int) { + d := make(map[int]int) for _, e := range intervals { - delta[e[0]]++ - delta[e[1]]-- + d[e[0]]++ + d[e[1]]-- + } + + keys := make([]int, 0, len(d)) + for k := range d { + keys = append(keys, k) } - for i := 1; i < n; i++ { - delta[i] += delta[i-1] + sort.Ints(keys) + + s := 0 + for _, k := range keys { + s += d[k] + ans = max(ans, s) } - return slices.Max(delta) + return +} +``` + +#### TypeScript + +```ts +function minMeetingRooms(intervals: number[][]): number { + const d: { [key: number]: number } = {}; + for (const [l, r] of intervals) { + d[l] = (d[l] || 0) + 1; + d[r] = (d[r] || 0) - 1; + } + + let [ans, s] = [0, 0]; + const keys = Object.keys(d) + .map(Number) + .sort((a, b) => a - b); + for (const k of keys) { + s += d[k]; + ans = Math.max(ans, s); + } + return ans; } ``` #### Rust ```rust -use std::{cmp::Reverse, collections::BinaryHeap}; +use std::collections::HashMap; impl Solution { - #[allow(dead_code)] pub fn min_meeting_rooms(intervals: Vec>) -> i32 { - // The min heap that stores the earliest ending time among all meeting rooms - let mut pq = BinaryHeap::new(); - let mut intervals = intervals; - let n = intervals.len(); - - // Let's first sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); - - // Push the first end time to the heap - pq.push(Reverse(intervals[0][1])); - - // Traverse the intervals vector - for i in 1..n { - // Get the current top element from the heap - if let Some(Reverse(end_time)) = pq.pop() { - if end_time <= intervals[i][0] { - // If the end time is early than the current begin time - let new_end_time = intervals[i][1]; - pq.push(Reverse(new_end_time)); - } else { - // Otherwise, push the end time back and we also need a new room - pq.push(Reverse(end_time)); - pq.push(Reverse(intervals[i][1])); - } - } + let mut d: HashMap = HashMap::new(); + for interval in intervals { + let (l, r) = (interval[0], interval[1]); + *d.entry(l).or_insert(0) += 1; + *d.entry(r).or_insert(0) -= 1; + } + + let mut times: Vec = d.keys().cloned().collect(); + times.sort(); + + let mut ans = 0; + let mut s = 0; + for time in times { + s += d[&time]; + ans = ans.max(s); } - pq.len() as i32 + ans } } ``` diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.cpp b/solution/0200-0299/0253.Meeting Rooms II/Solution.cpp index 2971b1431905a..0242f8d5e1651 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/Solution.cpp +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.cpp @@ -1,15 +1,20 @@ class Solution { public: int minMeetingRooms(vector>& intervals) { - int n = 1000010; - vector delta(n); - for (auto e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + int m = 0; + for (const auto& e : intervals) { + m = max(m, e[1]); } - for (int i = 0; i < n - 1; ++i) { - delta[i + 1] += delta[i]; + vector d(m + 1); + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; } - return *max_element(delta.begin(), delta.end()); + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = max(ans, s); + } + return ans; } -}; \ No newline at end of file +}; diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.go b/solution/0200-0299/0253.Meeting Rooms II/Solution.go index 88f25a7a1410a..61bd1ca79a537 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/Solution.go +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.go @@ -1,12 +1,19 @@ -func minMeetingRooms(intervals [][]int) int { - n := 1000010 - delta := make([]int, n) +func minMeetingRooms(intervals [][]int) (ans int) { + m := 0 for _, e := range intervals { - delta[e[0]]++ - delta[e[1]]-- + m = max(m, e[1]) } - for i := 1; i < n; i++ { - delta[i] += delta[i-1] + + d := make([]int, m+1) + for _, e := range intervals { + d[e[0]]++ + d[e[1]]-- + } + + s := 0 + for _, v := range d { + s += v + ans = max(ans, s) } - return slices.Max(delta) -} \ No newline at end of file + return +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.java b/solution/0200-0299/0253.Meeting Rooms II/Solution.java index 42db9201e47d7..bfdb5285ced20 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/Solution.java +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.java @@ -1,16 +1,19 @@ class Solution { public int minMeetingRooms(int[][] intervals) { - int n = 1000010; - int[] delta = new int[n]; - for (int[] e : intervals) { - ++delta[e[0]]; - --delta[e[1]]; + int m = 0; + for (var e : intervals) { + m = Math.max(m, e[1]); } - int res = delta[0]; - for (int i = 1; i < n; ++i) { - delta[i] += delta[i - 1]; - res = Math.max(res, delta[i]); + int[] d = new int[m + 1]; + for (var e : intervals) { + ++d[e[0]]; + --d[e[1]]; } - return res; + int ans = 0, s = 0; + for (int v : d) { + s += v; + ans = Math.max(ans, s); + } + return ans; } -} \ No newline at end of file +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.py b/solution/0200-0299/0253.Meeting Rooms II/Solution.py index 787a096dd3852..63ed57b18f5f4 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/Solution.py +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.py @@ -1,7 +1,12 @@ class Solution: def minMeetingRooms(self, intervals: List[List[int]]) -> int: - delta = [0] * 1000010 - for start, end in intervals: - delta[start] += 1 - delta[end] -= 1 - return max(accumulate(delta)) + m = max(e[1] for e in intervals) + d = [0] * (m + 1) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for v in d: + s += v + ans = max(ans, s) + return ans diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.rs b/solution/0200-0299/0253.Meeting Rooms II/Solution.rs index ad9cd0a9b24ec..a11e467a2ada7 100644 --- a/solution/0200-0299/0253.Meeting Rooms II/Solution.rs +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.rs @@ -1,35 +1,23 @@ -use std::{cmp::Reverse, collections::BinaryHeap}; - impl Solution { - #[allow(dead_code)] pub fn min_meeting_rooms(intervals: Vec>) -> i32 { - // The min heap that stores the earliest ending time among all meeting rooms - let mut pq = BinaryHeap::new(); - let mut intervals = intervals; - let n = intervals.len(); - - // Let's first sort the intervals vector - intervals.sort_by(|lhs, rhs| lhs[0].cmp(&rhs[0])); + let mut m = 0; + for e in &intervals { + m = m.max(e[1]); + } - // Push the first end time to the heap - pq.push(Reverse(intervals[0][1])); + let mut d = vec![0; (m + 1) as usize]; + for e in intervals { + d[e[0] as usize] += 1; + d[e[1] as usize] -= 1; + } - // Traverse the intervals vector - for i in 1..n { - // Get the current top element from the heap - if let Some(Reverse(end_time)) = pq.pop() { - if end_time <= intervals[i][0] { - // If the end time is early than the current begin time - let new_end_time = intervals[i][1]; - pq.push(Reverse(new_end_time)); - } else { - // Otherwise, push the end time back and we also need a new room - pq.push(Reverse(end_time)); - pq.push(Reverse(intervals[i][1])); - } - } + let mut ans = 0; + let mut s = 0; + for v in d { + s += v; + ans = ans.max(s); } - pq.len() as i32 + ans } } diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution.ts b/solution/0200-0299/0253.Meeting Rooms II/Solution.ts new file mode 100644 index 0000000000000..5a9811e8693c4 --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution.ts @@ -0,0 +1,14 @@ +function minMeetingRooms(intervals: number[][]): number { + const m = Math.max(...intervals.map(([_, r]) => r)); + const d: number[] = Array(m + 1).fill(0); + for (const [l, r] of intervals) { + d[l]++; + d[r]--; + } + let [ans, s] = [0, 0]; + for (const v of d) { + s += v; + ans = Math.max(ans, s); + } + return ans; +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.cpp b/solution/0200-0299/0253.Meeting Rooms II/Solution2.cpp new file mode 100644 index 0000000000000..b7b455ebaf024 --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.cpp @@ -0,0 +1,16 @@ +class Solution { +public: + int minMeetingRooms(vector>& intervals) { + map d; + for (const auto& e : intervals) { + d[e[0]]++; + d[e[1]]--; + } + int ans = 0, s = 0; + for (auto& [_, v] : d) { + s += v; + ans = max(ans, s); + } + return ans; + } +}; diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.go b/solution/0200-0299/0253.Meeting Rooms II/Solution2.go new file mode 100644 index 0000000000000..55278187da34e --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.go @@ -0,0 +1,20 @@ +func minMeetingRooms(intervals [][]int) (ans int) { + d := make(map[int]int) + for _, e := range intervals { + d[e[0]]++ + d[e[1]]-- + } + + keys := make([]int, 0, len(d)) + for k := range d { + keys = append(keys, k) + } + sort.Ints(keys) + + s := 0 + for _, k := range keys { + s += d[k] + ans = max(ans, s) + } + return +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.java b/solution/0200-0299/0253.Meeting Rooms II/Solution2.java new file mode 100644 index 0000000000000..64b95cef08d44 --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.java @@ -0,0 +1,15 @@ +class Solution { + public int minMeetingRooms(int[][] intervals) { + Map d = new TreeMap<>(); + for (var e : intervals) { + d.merge(e[0], 1, Integer::sum); + d.merge(e[1], -1, Integer::sum); + } + int ans = 0, s = 0; + for (var e : d.values()) { + s += e; + ans = Math.max(ans, s); + } + return ans; + } +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.py b/solution/0200-0299/0253.Meeting Rooms II/Solution2.py new file mode 100644 index 0000000000000..0db564338d7ff --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.py @@ -0,0 +1,11 @@ +class Solution: + def minMeetingRooms(self, intervals: List[List[int]]) -> int: + d = defaultdict(int) + for l, r in intervals: + d[l] += 1 + d[r] -= 1 + ans = s = 0 + for _, v in sorted(d.items()): + s += v + ans = max(ans, s) + return ans diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.rs b/solution/0200-0299/0253.Meeting Rooms II/Solution2.rs new file mode 100644 index 0000000000000..e35197162e2e3 --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.rs @@ -0,0 +1,24 @@ +use std::collections::HashMap; + +impl Solution { + pub fn min_meeting_rooms(intervals: Vec>) -> i32 { + let mut d: HashMap = HashMap::new(); + for interval in intervals { + let (l, r) = (interval[0], interval[1]); + *d.entry(l).or_insert(0) += 1; + *d.entry(r).or_insert(0) -= 1; + } + + let mut times: Vec = d.keys().cloned().collect(); + times.sort(); + + let mut ans = 0; + let mut s = 0; + for time in times { + s += d[&time]; + ans = ans.max(s); + } + + ans + } +} diff --git a/solution/0200-0299/0253.Meeting Rooms II/Solution2.ts b/solution/0200-0299/0253.Meeting Rooms II/Solution2.ts new file mode 100644 index 0000000000000..90a204cead1cc --- /dev/null +++ b/solution/0200-0299/0253.Meeting Rooms II/Solution2.ts @@ -0,0 +1,17 @@ +function minMeetingRooms(intervals: number[][]): number { + const d: { [key: number]: number } = {}; + for (const [l, r] of intervals) { + d[l] = (d[l] || 0) + 1; + d[r] = (d[r] || 0) - 1; + } + + let [ans, s] = [0, 0]; + const keys = Object.keys(d) + .map(Number) + .sort((a, b) => a - b); + for (const k of keys) { + s += d[k]; + ans = Math.max(ans, s); + } + return ans; +}