253. 会议室 II
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]]
输出:2
示例 2:
输入:intervals = [[7,10],[2,4]]
输出:1
提示:
1 <= intervals.length <= 104
0 <= starti < endi <= 106
解题
此题本质上还是比较一个会议的结束时间 和 下一个会议的开始时间的关系,如果结束时间大于开始时间,则需要的会议室数就加1。所以我们需要先按开始时间排序,然后遍历,比较结束时间与开始时间
方法一:利用小顶堆
小根堆的元素数量表示从开始到结束这个范围上重合的区间的最大值; 本质上就是求开始到结束范围上的重合区间数量最大值。
思路:先把数组按照开始时间升序,然后使用最小堆的元素个数表示重叠的区间数量; 堆中压入结束时间; 如果当前的开始时间大于等于最小堆堆顶的结束时间, 说明有一个会议开完了, 弹出堆顶元素
class Solution {
public int minMeetingRooms(int[][] intervals) {
//对数组按照开始时间升序排序
Arrays.sort(intervals, (a,b)->a[0]-b[0]);
//最小堆中存放结束时间; 最小堆中的元素数量表示从开始到结束重合的区间数量的最大值
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for(int i=0; i<intervals.length; i++){
//如果最小堆不为空,并且当前时间段的开始时间大于等于堆顶元素, 说明之前有个会议结束了, 弹出该堆顶元素, 表示会议室数量减一
if(!minHeap.isEmpty() && intervals[i][0]