会议室 II
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:
输入: [[7,10],[2,4]]
输出: 1
这个题目有点类似于上下车问题。本题是规划的对于时间冲突的解决方案。
根据题目,我们发现,并不需要在意该会议持续时间。因为会议时间已经固定了,所以我们只需要关注会议室及其会议结束时间即可。因为只有会议时间结束,才能进行下一个会议。否则,这需要开一个新的会议室,去进行会议。为了最优开会成本和时间效率,下一个会议进入的房间,根据会议室结束时间和该会议开始时间的差决定,时间差越小,开会越能“无缝连接”,于是效率越高。
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals == null || intervals.length ==0)
return 0;
// 根据会议开始时间,数组的重新排序(开始时间的从小到大)
Arrays.sort(intervals,new Comparator<>(){
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
// 定义一个HashMap记录会议室及其结束时间
Map<Integer,Integer> RoomTime = new HashMap<>();
// 第一个开始会议的已经毋庸置疑,就是开会时间最早的那个会议,也就是排序后的第一个会议
RoomTime.put(1,intervals[0][1]);
// 定义一个表示符号,用于后面的forEach跳过第一个会议,因为第一个会议已经安排好了
boolean isFirst = false;
for(int[] item :intervals){
if(!isFirst)
{
// 跳过第一个会议,因为已经安排了
isFirst = !isFirst;
continue;
}
// 时间差
int fix = 0;
// 该会议,目前临时安排的房间
int tempRoom = 0;
// 循环所有会议室
for(Map.Entry<Integer,Integer> entry: RoomTime.entrySet()){
// 如果时间上满足要求
if(entry.getValue() <= item[0])
{
// 取最优的会议室给当前会议
if(fix == 0 || item[0] - entry.getValue() <= fix)
{
fix = item[0] - entry.getValue();
tempRoom = entry.getKey();
}
}
}
// 如果临时间号不为0,则有房间满足要求。否则,说明没有房间满足要求,需要开一个新的会议室,安排该会议
if(tempRoom != 0)
RoomTime.put(tempRoom, item[1]);
else
RoomTime.put(RoomTime.size() + 1,item[1]);
}
// 最后返回房间的数量,即是本题的答案
return RoomTime.size();
}
}