[LeetCode] 253. Meeting Rooms II 会议室 II

Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required.

For example,
Given [[0, 30],[5, 10],[15, 20]],
return 2.

252. Meeting Rooms 的拓展,同样给一个开会的区间数组,返回最少需要的房间数。

解法1: 把区间变成2个数组:start时间数组和end时间数组,并对两个数组排序。然后一个指针遍历start数组,另一个指针指向end数组。如果start时间小于end时间,房间数就加1,start时间加1,比较并记录出现过的最多房间数。start时间大于end,则所需房间数就减1,end指针加1。

解法2:最小堆minHeap,先按start排序,然后维护一个minHeap,堆顶元素是会议结束时间最早的区间,也就是end最小。每次比较top元素的end时间和当前元素的start时间,如果end < start,说明该room可以结束接下来被当前会议区间使用。最后返回堆的大小就是所需的房间数。

面试follow up: 结果要将会议名称跟对应房间号一起返回,而不仅仅是算需要的房间数目。

Java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */ 
public class Solution { 
    public int minMeetingRooms(Interval[] intervals) { 
        if(intervals == null || intervals.length == 0) return 0
        int min = 0; int max = 0
        for(int i=0; i<intervals.length; i++){ 
            min = Math.min(min, intervals[i].start); 
            max = Math.max(max, intervals[i].end); 
        
           
        int[] count = new int[max-min+1]; 
        for(int i=0; i<intervals.length; i++){ 
            count[intervals[i].start]++; 
            count[intervals[i].end]--; 
        
        int maxroom = Integer.MIN_VALUE; 
        int num = 0
        for(int i=0; i<count.length; i++){ 
            num += count[i]; 
            maxroom = Math.max(maxroom, num); 
        
        return maxroom; 
    
}    

Java:minHeap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Solution {
   public int minMeetingRooms(Interval[] intervals) {   
     int n=intervals.length;   
     Arrays.sort(intervals, new Comparator<Interval>(){ 
         public int compare(Interval a, Interval b) {   
           return a.start-b.start;   
         
     });   
     PriorityQueue<Integer> pq=new PriorityQueue<>();   
     for (int i=0; i<n; i++) {   
       if (i>0 && intervals[i].start>=pq.peek()) pq.poll();   
       pq.add(intervals[i].end);   
     }   
     return pq.size();   
   }   
 }      

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution:
    # @param {Interval[]} intervals
    # @return {integer}
    def minMeetingRooms(self, intervals):
        starts, ends = [], []
        for i in intervals:
            starts.append(i.start)
            ends.append(i.end)
 
        starts.sort()
        ends.sort()
 
        s, e = 0, 0
        min_rooms, cnt_rooms = 0, 0
        while s < len(starts):
            if starts[s] < ends[e]:
                cnt_rooms += 1  # Acquire a room.
                # Update the min number of rooms.
                min_rooms = max(min_rooms, cnt_rooms)
                s += 1
            else:
                cnt_rooms -= 1  # Release a room.
                e += 1
 
        return min_rooms

C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
    int minMeetingRooms(vector<Interval>& intervals) {
        vector<int> starts, ends;
        for (const auto& i : intervals) {
            starts.emplace_back(i.start);
            ends.emplace_back(i.end);
        }
         
        sort(starts.begin(), starts.end());
        sort(ends.begin(), ends.end());
         
        int min_rooms = 0, cnt_rooms = 0;
        int s = 0, e = 0;
        while (s < starts.size()) {
            if (starts[s] < ends[e]) {
                ++cnt_rooms;  // Acquire a room.
                // Update the min number of rooms.
                min_rooms = max(min_rooms, cnt_rooms);
                ++s;
            } else {
                --cnt_rooms;  // Release a room.
                ++e;
            }
        }
        return min_rooms;
    }
};

C++: minHeap

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
    int minMeetingRooms(vector<Interval>& intervals) {
        sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){return a.start < b.start;});
        priority_queue<int, vector<int>, greater<int>> q;
        for (auto a : intervals) {
            if (!q.empty() && q.top() <= a.start) q.pop();
            q.push(a.end);
        }
        return q.size();
    }
};

  

  

类似题目:

[LeetCode] 252. Meeting Rooms 会议室

[LeetCode] 56. Merge Intervals 合并区间

 

All LeetCode Questions List 题目汇总

 

posted @   轻风舞动  阅读(6165)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示