【LeetCode - 253】会议室 II

1、题目描述

在这里插入图片描述

2、解题思路

  假设一开始一个会议室都没开放,且会议室开放后不会关闭,可以重复使用。

  按照我们日常的逻辑,先对所有的会议安排按照开始时间升序排列。

  安排第一个会议,此时一个会议室都没有,直接开放一间会议室使用;

  安排第 i 个会议,查看当前有没有会议室是已开放且空闲的,没有则接着开放新的会议室;

  查看是否有会议室已开放且空闲,是看当前正在使用会议室的会议中,最早结束的那场会议的结束时间,如果现在还没结束,说明其他会议更不可能结束,直接开放新的会议室。

  若在以开放的会议室中,最早结束的那场会议以及结束,说明现在存在空闲会议室,直接加入即可。

  先对所有的会议时间按开始时间从小到大排序。

  接着定义一个小顶堆作为会议室,每个节点的值是会议的结束时间。

  小顶堆在我的代码中是用优先队列。无论加入多少个队列,小顶堆的堆顶就是当前使用会议室中最早的结束时间,并且小顶堆的元素个数即会议室当前占用的间数。

  最早开始的会议的结束时间 add 到小顶堆中。

  接着对 [1, size-1] 个会议依次进行以下操作:

  1、对比当前会议的开始时间和小顶堆的堆顶元素值,若小于,说明当前所有会议室正在进行的会议中,最早结束的都还没结束,只能新建会议室了;

  2、若当前会议的开始时间大于小顶堆的堆顶元素值,说明会议室正在进行的会议中,最早结束的会议已经结束,可以把它从小顶堆删除,自己进入小顶堆(重复利用会议室)。

  等最后一个会议时间进入小顶堆,此时的小顶堆元素个数即至少需要的会议室数量。

3、解题代码

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if (intervals.length == 0) return 0;

        // 最小堆
        PriorityQueue<Integer> allocator = new PriorityQueue<Integer>(intervals.length, (a, b) -> a - b);

        // 对时间表按照开始时间从小到大排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        // 添加第一场会议的结束时间
        allocator.add(intervals[0][1]);

        // 遍历除第一场之外的所有会议
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] >= allocator.peek()) {
                // 如果当前会议的开始时间大于前面已经开始的会议中最晚结束的时间
                // 说明有会议室空闲出来了,可以直接重复利用
                // 当前时间已经是 intervals[i][0],因此把已经结束的会议删除
                allocator.poll();
            }
            // 把当前会议的结束时间加入最小堆中
            allocator.add(intervals[i][1]);
        }

        // 当所有会议遍历完毕,还在最小堆里面的,说明会议还没结束,此时的数量就是会议室的最少数量
        return allocator.size();
    }
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值