问题描述
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间
[
[
s
1
,
e
1
]
,
[
s
2
,
e
2
]
⋯
]
(
s
i
<
e
i
)
[[s1,e1],[s2,e2]\cdots](s_i <e_i)
[[s1,e1],[s2,e2]⋯](si<ei) ,为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排
输
入
:
[
[
0
,
30
]
,
[
5
,
10
]
,
[
15
,
20
]
]
输入:[[0, 30],[5, 10],[15, 20]]
输入:[[0,30],[5,10],[15,20]]
输
出
:
2
输出:2
输出:2
解题报告
当一个会议室使用结束后,可以用于其他会议。
建一个最小堆,堆中保存每个会议的结束时间,每次从堆中取出一个元素:
- 当该元素小于当前会议的起始时间时,表示目前有一个空会议室。将堆中元素弹出,并将当前会议的结束时间压入。
- 当该元素大于当前会议的起始时间时,表示最早结束的会议室目前都不是空的,所以需要重新启用一个会议室。
最后看堆中有几个元素,则表示需要多少个会议室。
实现代码
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
priority_queue<int, vector<int>, greater<int>> pq;
int s,e;
for(int i=0;i<intervals.size();i++){
s=intervals[i][0];
e=intervals[i][1];
if(pq.size()==0){
pq.push(e);
continue;
}
if(pq.top()<=s){
pq.pop();
}
pq.push(e);
}
return pq.size();
}
};