21._252_会议室
标签:数组、排序
思路:对所有的会议时间进行排序,遍历所有的会议时间,如果下一个会议的开始时间小于上一个会议的结束时间,返回false;
代码:
public boolean canAttendMeetings(int[][] intervals){
if(intervals == null || intervals.length == 0) return true;
// 按照会议的开始时间,从小到大排序
Arrays.sort(intervals,(m1,m2) -> m1[0] - m2[0]);
// 遍历每一个会议
for(int i = 1;i < intervals.length;i++){
if(intervals[i][0] < intervals[i - 1][1]) return false;
}
return true;
}
2._253_会议室Ⅱ
标签:数组、最小堆、排序
思路1:1)先对所有的会议按开始时间进行排序。
2)遍历所有的会议。如果会议的开始时间 < 小顶堆的最小值,则将此会议的结束时间添加至小顶堆中;如果会议的开始时间 >=小顶堆的最小值,则删除小顶堆中的最小值,并将此会议的结束时间添加至小顶堆中。
3)最后返回heap.size()
代码:
public int minMeetingRooms(int[][] intervals){
if(intervals == null || intervals.length == 0) return 0;
Arrays.sort(intervals,(m1, m2) -> m1[0] - m2[0]);
// 建立一个小顶堆
PriorityQueue<Integer> heap = new PriorityQueue<>();
// 添加0号会议的结束时间
heap.add(intervals[0][1]);
for(int i = 1;i < intervals.length;i++){
// 下一个会议的开始时间 >= 最小值
if(intervals[i][0] >= heap.peek()){
heap.remove();
}
heap.add(intervals[i][1]);
}
return heap.size();
}
}
时间复杂度O(nlogn) 空间复杂度O(n)
思路2:分开排序
对会议的开始时间和会议的结束时间分别排序
public int minMeetingRooms(int[][] intervals){
if(intervals == null || intervals.length == 0) return 0;
int room = 0;
int[] begins = new int[intervals.length];
int[] ends = new int[intervals.length];
Arrays.sort(intervals,(m1,m2) -> m1[0] - m2[0]);
for(int i = 0;i < intervals.length;i++){
begins[i] = intervals[i][0];
ends[i] = intervals[0][i];
}
int endIdx = 0;
for(int begin : begins){
if(begin >= ends[endIdx]){ //能重复利用会议室
endIdx++;
}else{ //需要新开一个会议室
room++;
}
}
return room;
}