Leetcode 253. 会议室 II
https://leetcode-cn.com/problems/meeting-rooms-ii/
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]]
输出:2
示例 2:
输入:intervals = [[7,10],[2,4]]
输出:1
提示:
1 <= intervals.length <= 104
0 <= starti < endi <= 106
解题思路:
使用小顶堆来解题的方法,这种方法先把所有的时间区间按照起始时间排序,然后新建一个小顶堆,开始遍历时间区间,如果堆不为空,且首元素小于等于当前区间的起始时间,去掉堆中的首元素,把当前区间的结束时间压入堆,由于最小堆是小的在前面,那么假如首元素小于等于起始时间,说明上一个会议已经结束,可以用该会议室开始下一个会议了,所以不用分配新的会议室,遍历完成后堆中元素的个数即为需要的会议室的个数,参见代码如下:
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
//先把所有的时间区间按照起始时间排序
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){ return a[0] < b[0]; });
//然后新建一个小顶堆
priority_queue<int, vector<int>, greater<int>> q;
//如果堆不为空,且首元素小于等于当前区间的起始时间
for (auto interval : intervals) {
if (!q.empty() && q.top() <= interval[0]) q.pop();
//遍历完成后堆中元素的个数即为需要的会议室的个数
q.push(interval[1]);
}
return q.size();
}
};
同样:
https://blog.csdn.net/u013395337/article/details/113100501