问题
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排
例子

思路
-
方法1
$$$$
统计同一时刻进行的最大会议的数量(也即需要的最多房间)
分别按照开始时间和结束时间排序,遍历两个数组 -
方法2
$$$$
每当有新会议时,就遍历所有房间,如果有空房间(新会议的结束时间>=堆顶会议的结束时间:因为堆顶是最早结束的,如果它还不结束,则其他的都不结束),不用开新房间了,更新旧房间的结束时间,否则开新房间
使用优先队列,最小堆,堆顶为结束时间最早的会议
代码
//方法1
class Solution {
public int minMeetingRooms(int[][] arr) {
int[] b = new int[arr.length];
int[] e = new int[arr.length];
for(int i=0;i<arr.length; i++) {
b[i]=arr[i][0];
e[i]=arr[i][1];
}
Arrays.sort(b);
Arrays.sort(e);
int i=0,j=0;
int max=0,cur=0;
while(i<arr.length && j<arr.length) {
if(b[i]<e[j]) {
cur++;
i++;
}else if(b[i]==e[j]){i++;j++;}
else{
cur--;
j++;
}
max = Math.max(max, cur);
}
return max;
}
}
//方法2
class Solution {
public int minMeetingRooms(int[][] arr) {
if(arr.length==0) return 0;
//开多少个房间,给每个房间贴上结束的时间,peek为结束最早的会议
PriorityQueue<Integer> q = new PriorityQueue<>();
//开始时间排序
Arrays.sort(arr,(a,b)->a[0]-b[0]);
q.offer(arr[0][1]);
for(int i=1; i<arr.length; i++) {
//有空房间,把空房间里的旧会议清除,贴上新会议的结束时间
if(arr[i][0]>=q.peek())
q.poll();
//没有空房间,就开一个房间,贴上新会议的结束时间
q.offer(arr[i][1]);
}
return q.size();
}
}

给定会议开始和结束时间,求解避免冲突并最大化会议室利用率的问题。通过排序会议时间并使用优先队列(最小堆)来动态更新会议室占用情况,确定最少所需会议室数量。
654

被折叠的 条评论
为什么被折叠?



