Leetcode--Java--253. 会议室 II
题目描述
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。
样例描述
示例 1: 输入:intervals = [[0,30],[5,10],[15,20]] 输出:2 示例 2: 输入:intervals = [[7,10],[2,4]] 输出:1
思路
排序 + 优先队列(最小堆)
- 将所有会议按照开始时间排序,优先队列存储会议的结束时间由小到大排序
- 对于当前的会议,如果开始时间小于优先队列元素的会议结束时间,就需要新开一个房间,因此将它重新入队
- 最后优先队列剩余的就是最少的会议室数(结合下面的过程图来理解,也可以另外用一个变量记录房间数)
代码
class Solution { public int minMeetingRooms(int[][] intervals) { Arrays.sort(intervals, (a, b) -> (a[0] - b[0])); //存结束时间由小到大 PriorityQueue<Integer> pq = new PriorityQueue<>(); int n = intervals.length; int res = 1; for (int i = 0; i < n; i ++ ) { if (!pq.isEmpty()) { int end = pq.poll(); //如果开始时间比上一个的结束时间小,就需要新开一个房间 //同时让上一个的结束时间重新入队 if (intervals[i][0] < end) { pq.offer(end); res ++; } } pq.add(intervals[i][1]); } return res; } }