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

思路

排序 + 优先队列(最小堆)

  1. 将所有会议按照开始时间排序,优先队列存储会议的结束时间由小到大排序
  2. 对于当前的会议,如果开始时间小于优先队列元素的会议结束时间,就需要新开一个房间,因此将它重新入队
  3. 最后优先队列剩余的就是最少的会议室数(结合下面的过程图来理解,也可以另外用一个变量记录房间数)
    Leetcode--Java--253. 会议室 II_第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;
    }
}

你可能感兴趣的:(Leetcode,排序,优先队列)