给定一系列的会议时间间隔intervals,包括起始和结束时间[[s1,e1],[s2,e2],...] (si < ei)
,找到所需的最小的会议室数量。
样例1
输入: intervals = [(0,30),(5,10),(15,20)]
输出: 2
解释:
需要两个会议室
会议室1:(0,30)
会议室2:(5,10),(15,20)
样例2
输入: intervals = [(2,7)]
输出: 1
解释:
只需要1个会议室就够了
OJ链接:来自lintcode
使用贪心+二分求解。
首先枚举出会议室的上界和下界,其中上界为会议任务的数目(即为每个会议都准备一个会议室总不会出错吧),下界为1(所有会议没有交集,可以交替执行完毕)。然后对上下界二分,得到中间值,判断中间值是否可以满足会议需求。我们知道若n 可以满足会议需求时,n + 1也一定满足,因此只需要二分找到满足条件的最小值即可。
此外对于给定会议室数量记做num判断其能否满足会议需求,使用贪心的策略。首先对会议任务按照起始时间(若起始时间相同则按结束时间)从小到大排序。使用一容量为num的最小堆(该最小堆以end作为关键字),初始化时将前面的num个任务扔入最小堆,从下标num开始往后遍历,遍历过程中每次从最小堆中弹一个元素记做cur1,再将当前位置的任务记做cur2添加进最小堆,不过添加之前需判断cur1.end 和cur2.start :
若cur1.end > cur2.start,返回false,这是由于在当前情况下[cur2.start : cur1.end]这段时间已经有num个会议占用着会议室,cur2任务无法完成。
若所有的会议均可完成,返回true。
代码如下:
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param intervals: an array of meeting time intervals
* @return: the minimum number of conference rooms required
*/
public int minMeetingRooms(List<Interval> intervals) {
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval o1, Interval o2){
if(o1.start != o2.start){
return o1.start - o2.start;
}else{
return o1.end - o2.end;
}
}
});
// 下界
int left = 1;
// 上界
int right = intervals.size();
while(left < right){
int mid = left + (right - left) / 2;
if(canSatisfy(intervals, mid)){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
public boolean canSatisfy(List<Interval> intervals, int num){
Queue<Interval> minHeap = new PriorityQueue<>(new Comparator<Interval>(){
public int compare(Interval o1, Interval o2){
return o1.end - o2.end;
}
});
int start = 0;
for(int i = 0; i < num; i++){
minHeap.add(intervals.get(i));
}
for(int i = num; i < intervals.size(); i++){
// 上段时间的终止时刻,亦为当前时间段中的起始时刻
start = minHeap.remove().end;
if(intervals.get(i).start < start){
return false;
}
minHeap.add(intervals.get(i));
}
return true;
}
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有