描述
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:
输入: [[7,10],[2,4]]
输出: 1
思路
- 方法1:优先队列--最小堆
1.按照会议开始时间进行排序;
2.遍历会议建立会议结束时间的最小堆,如果当前会议开始时间大于堆顶会议结束时间,则将堆顶会议去除,更新当前会议;
class Solution {
public:
static bool cmp(vector a, vector b){
return a[0]>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
priority_queue, greater> heap;
for(auto iter:intervals){
if(!heap.empty()&&heap.top()<=iter[0]){
heap.pop();
}
heap.push(iter[1]);
}
return heap.size();
}
};
- 方法2:双指针法
1.分离会议开始时间与结束时间,升序排序
2.双指针遍历开始时间与结束时间,当开始时间大于等于结束时间时,房间数不变,结束时间指针+1
class Solution {
public:
int minMeetingRooms(vector>& intervals) {
int count=0;
vector start,end;
for(auto i:intervals){
start.push_back(i[0]);
end.push_back(i[1]);
}
sort(start.begin(),start.end(),less());
sort(end.begin(),end.end(),less());
auto i=start.begin(),j=end.begin();
while(i!=start.end()&&j!=end.end()){
if(*i>=*j){
count--;
j++;
}
count++;
i++;
}
return count;
}
};