LeetCode—253.會議室 II(Meeting Rooms II)——分析及程式碼(C++)

江南土豆發表於2019-11-27

LeetCode—253.會議室 II[Meeting Rooms II]——分析及程式碼[C++]

一、題目

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

示例 1:

輸入: [[0, 30],[5, 10],[15, 20]]
輸出: 2

示例 2:

輸入: [[7,10],[2,4]]
輸出: 1

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/meeting-rooms-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

二、分析及程式碼

1. 起止時間分別排序

(1)思路

設計兩個向量,分別記錄所有會議的 開始時間 和 結束時間 並排序,用兩個整數分別記錄當前的 會議室數量 及 空餘會議室數量。
遍歷 開始時間,依次處理:
1)有 結束時間 < 當前開始時間,空餘會議室數量++,指標指向下一 結束時間;
2)若 空餘會議室數量 = 0,會議室數量++;
3)若 空餘會議室數量 != 0,空餘會議室數量–;
因為排序後陣列一定滿足 第 i 個開始時間 < 第 i 個結束時間,過程不會出錯。

(2)程式碼

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        if (intervals.empty())
            return 0;
        vector<int> begin_time(intervals.size());//所有會議的開始時間 
        vector<int> end_time(intervals.size());//所有會議的結束時間
        for (int i = 0; i < intervals.size(); i++) {
            begin_time[i] = intervals[i][0];
            end_time[i] = intervals[i][1];
        }
        sort(begin_time.begin(), begin_time.end());
        sort(end_time.begin(), end_time.end());
        int room = 0, free_room = 0, endnum = 0;//會議室數量,空餘會議室數量,已結束的會議個數
        for (int i = 0; i < intervals.size(); i++) {
            int time = begin_time[i];
            while (endnum < intervals.size() && end_time[endnum] < time + 1) {//處理當前時間前已結束的會議
                endnum++;
                free_room++;
            }
            if (free_room > 0)//有空餘會議室,借下1個空餘會議室
                free_room--;
            else//無空餘會議室,需新會議室
                room++;
        }
        return room;
    }
};

(3)結果

執行用時 :20 ms, 在所有 C++ 提交中擊敗了 91.94% 的使用者;
記憶體消耗 :12 MB, 在所有 C++ 提交中擊敗了 100.00% 的使用者。

三、其他

暫無。

相關文章