[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:

/** 
 * 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

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:

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++:

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

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 題目匯總

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM