【LeetCode】253. Meeting Rooms II 解題報告(C++)

負雪明燭發表於2019-09-17

題目地址:https://leetcode-cn.com/problems/meeting-rooms/

題目描述

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.

Example 1:

Input: [[0, 30],[5, 10],[15, 20]]
Output: 2

Example 2:

Input: [[7,10],[2,4]]
Output: 1

題目大意

給定一個會議時間安排的陣列,每個會議時間都會包括開始和結束的時間 [[s1,e1],[s2,e2],…] (si < ei),為避免會議衝突,同時要考慮充分利用會議室資源,請你計算至少需要多少間會議室,才能滿足這些會議安排。

解題方法

排序+堆

這個做法參考了官方解答,先對所有的區間按照開始時間進行排序,使用小根堆儲存每個會議的結束時間,堆的大小表示了現在已經佔用了多少個會議室。

思路是,我們要申請會議室的時候,先看是不是可以釋放會議室,將已經佔用的會議室釋放。

遍歷判斷每個區間的開始時間是否大於等於小根堆中最小元素(最早結束時間),如果大於等於,說明堆裡面有個會議要結束了,將其彈出,代表釋放了一個會議室;否則,說明堆裡面的已經在使用的會議室沒有空閒,只能新增加一個會議室。

由於優先佔用釋放的會議室,所以最後堆裡面的元素個數表示總的需要佔用多少個會議室。

C++程式碼如下:

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>&b) {return a[0] < b[0];});
        priority_queue<int, vector<int>, greater<int>> que;
        for (vector<int>& interval : intervals) {
            if (!que.empty() && interval[0] >= que.top()) {
                que.pop();
            }
            que.push(interval[1]);
        }
        return que.size();
    }
};

參考資料:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/

日期

2019 年 9 月 17 日 —— 聽了hulu宣講會,覺得hulu的壓力不大

相關文章