给你一个会议时间安排的数组 intervals
,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi]
,返回 所需会议室的最小数量 。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]] 输出:2
示例 2:
输入:intervals = [[7,10],[2,4]] 输出:1
解析:首先根据会议开始时间将所有会议进行排序;然后将第一个会议的结束时间作为root值来创建优先队列,后续的会议根据开始时间找堆中的空闲房间:
- 如果房间的值(结束时间)小于后续会议,则更新其结束时间为新的会议结束时间
- 如果没有房间的结束时间小于后续会议,则根据后续会议结束时间,插入当前堆
这里无论找没找到可用的房间,最终都要push当前会议时间到堆中,区别在于找到房间的话,要把找到的房间pop出来,用新时间去替代pop掉的房间。
堆排序最上边的值一定是最小的,如果最小的会议结束时间都不满足,那直接拆入新时间就好。
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
if (intervals.size() == 0)
return 0;
sort(intervals.begin(), intervals.end());
priority_queue<int, vector<int>, greater<int>> rooms;
rooms.push(intervals[0][1]);
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= rooms.top()) {
rooms.pop();
}
rooms.push(intervals[i][1]);
}
return rooms.size();
}
};
相关:
1、priority_queue
2、堆排序