1 题目
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...]
(si < ei), find the minimum number of conference rooms required.
Example 1:
Input: [[0, 30],[5, 10],[15, 20]]
Output: 2
Example 2:
Input: [[7,10],[2,4]]
Output: 1
2 尝试解
2.1 分析
给定若干个活动的起始时间,求不冲突情况下最多能参加多少个活动的变形版,即每次给定一间会议室,尽可能多地挑选活动,如果活动有剩余,再新开一间会议室,重复操作,最后返回会议室间数即可。
2.2 代码
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
if(!intervals.size()) return 0;
sort(intervals.begin(),intervals.end());
int result = 0,left;
do{
left = 0;
result += 1;
int end = 0;
for(int i = 0; i < intervals.size(); i++){
if(intervals[i][0] >= end){
intervals[i][0]= -1;
end = intervals[i][1];
}
else if(intervals[i][0] > 0)
left = 1;
}
}while(left);
return result;
}
};
3 标准解
3.1 分析
首先直觉上需要按照每个活动的开始时间进行排序,然后进行分配。加入现在已经为前n个活动分配了m间会议室,现在考虑第n+1个活动,其起始时间为start,如果在该时刻,会议室中已经有任意一间空闲,那么就可以为该活动分配这个会议室。因为之后的活动开始时间只会更晚,所以我们可以把任意一间分配给该活动,不会影响后续分配。如果在该时刻,最早结束的会议都还没结束,那么只能新开会议室了。
所以该问题的解法就是,用一个最小堆存储当前会议室中最早的结束时间min_end,如果下一个活动开始时间start > min_end,则将该会议室分配给该活动,然后删除堆顶元素,将新活动的结束时间压入堆中。否则,就要新开会议室,同时将新活动的结束时间压入堆中。
3.2 代码
class Solution {
public:
struct cmp{
bool operator()(vector<int>&A,vector<int>&B){
return A[0] > B[0];
}
};
int minMeetingRooms(vector<vector<int>>& intervals) {
priority_queue<int,vector<int>,greater<int>> end;
sort(intervals.begin(),intervals.end());
int result = 0;
for(int i = 0; i < intervals.size(); i++){
if(end.empty()||end.top() > intervals[i][0]){
result += 1;
}
else{
end.pop();
}
end.push(intervals[i][1]);
}
return result;
}
};