题目
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:
输入: [[7,10],[2,4]]
输出: 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这道题的重点是可以抛弃到开始时间和结束时间的对应关系,因为它没用
方法一:指针
1 开两个一维数组,分别存放开始时间、结束时间。
2 数组排序。
3 两个数组分别维护一个指针,均初始化为第一个位置,然后按时间顺序右移指针。
4 维护房间数roomCnt=begIdx+1-endIdx,它的最大值即为所求。
方法二:堆
1 用最小堆堆存结束时间,堆顶元素即为最快结束的房间。
2 按开始时间排序会议,遍历数组,每次比较该元组结束时间和堆顶元素,若堆顶元素即结束时间大于该起始时间,则将结束时间加入堆,若小于则更新堆顶元素
3 最终堆的size即为所求
代码
方法一
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals==null||intervals.length==0){
return 0;
}
int len=intervals.length;//
int[] end=new int[len];
int[] beg=new int[len];
for(int i=0;i<intervals.length;++i){
end[i]=intervals[i][1];
beg[i]=intervals[i][0];
}
Arrays.sort(end);
Arrays.sort(beg);
int idxBeg=0;
int idxEnd=0;
int maxRoomCnt=0;
int roomCnt=0;
while(idxBeg<len&&idxEnd<len){//
roomCnt=idxBeg+1-idxEnd;
maxRoomCnt=roomCnt>maxRoomCnt?roomCnt:maxRoomCnt;
if(idxBeg!=len-1&&beg[idxBeg+1]<end[idxEnd]){//
idxBeg++;
}else{
idxEnd++;
}
}
return maxRoomCnt;
}
}