版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
力扣官方题解
https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals.length == 0) return 0;
in[] mem = new in[intervals.length];
for(int i = 0; i < intervals.length; ++i){
mem[i] = new in(intervals[i][0], intervals[i][1]);
}
Arrays.sort(mem, new Comparator<in>() {
@Override
public int compare(in o1, in o2) {
return o1.b - o2.b;
}
});
int max = 1;
for(int i = mem.length - 1; i > 0; --i){
int mem_sum = 1;
for(int j = i - 1; j >= 0; --j){
if(mem[i].b < mem[j].e){
++mem_sum;
}
}
if(mem_sum > max){
max = mem_sum;
}
}
return max;
}
}
class in{
public int b = 0;
public int e = 0;
public in(){
}
public in(int b, int e){
this.b = b;
this.e = e;
}
}
大神给的方法,利用了优先队列
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals.length == 0) return 0;
Arrays.sort(intervals,Comparator.comparingInt(o->o[0]));
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
int rooms = 0;
for(int i=0; i<intervals.length; i++) {
minHeap.offer(intervals[i][1]);
if (intervals[i][0] < minHeap.peek()) {
rooms ++;
} else {
minHeap.poll();
}
}
return rooms;
}
}
作者:18520397110
链接:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/tan-xin-suan-fa-you-xian-dui-lie-shi-xian-tong-guo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
除了用优先队列,还可用将会议的开始时间和结束时间分开比较。优先队列和这种方法都在力扣的官方解答里详细阐明了
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals.length == 0) return 0;
int[] starts = new int[intervals.length];
int[] ends = new int[intervals.length];
for(int i = 0; i < starts.length; ++i) starts[i] = intervals[i][0];
for(int i = 0; i < ends.length; ++i) ends[i] = intervals[i][1];
int index_start = 0;
int index_end = 0;
int sum = 0;
Arrays.sort(starts);
Arrays.sort(ends);
while(index_start < intervals.length && index_end < intervals.length){
if(starts[index_start] >= ends[index_end]){
index_end++;
}else{
++sum;
}
++index_start;
}
return sum;
}
}