Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >会议室问题

会议室问题

作者头像
你的益达
发布于 2020-08-05 06:32:30
发布于 2020-08-05 06:32:30
71600
代码可运行
举报
运行总次数:0
代码可运行

问题描述:

给定一系列的会议时间间隔intervals,包括起始和结束时间[[s1,e1],[s2,e2],...] (si < ei),找到所需的最小的会议室数量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
样例1

输入: intervals = [(0,30),(5,10),(15,20)]
输出: 2
解释:
需要两个会议室
会议室1:(0,30)
会议室2:(5,10),(15,20)
样例2

输入: intervals = [(2,7)]
输出: 1
解释:
只需要1个会议室就够了

OJ链接:来自lintcode

解决方案

使用贪心+二分求解。

首先枚举出会议室的上界和下界,其中上界为会议任务的数目(即为每个会议都准备一个会议室总不会出错吧),下界为1(所有会议没有交集,可以交替执行完毕)。然后对上下界二分,得到中间值,判断中间值是否可以满足会议需求。我们知道若n 可以满足会议需求时,n + 1也一定满足,因此只需要二分找到满足条件的最小值即可。

此外对于给定会议室数量记做num判断其能否满足会议需求,使用贪心的策略。首先对会议任务按照起始时间(若起始时间相同则按结束时间)从小到大排序。使用一容量为num的最小堆(该最小堆以end作为关键字),初始化时将前面的num个任务扔入最小堆,从下标num开始往后遍历,遍历过程中每次从最小堆中弹一个元素记做cur1,再将当前位置的任务记做cur2添加进最小堆,不过添加之前需判断cur1.end 和cur2.start :

若cur1.end > cur2.start,返回false,这是由于在当前情况下[cur2.start : cur1.end]这段时间已经有num个会议占用着会议室,cur2任务无法完成。

若所有的会议均可完成,返回true。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 * }
 */

public class Solution {
    /**
     * @param intervals: an array of meeting time intervals
     * @return: the minimum number of conference rooms required
     */
    public int minMeetingRooms(List<Interval> intervals) {
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval o1, Interval o2){
                if(o1.start != o2.start){
                    return o1.start - o2.start;
                }else{
                    return o1.end - o2.end;
                }
            }
        });
        // 下界
        int left = 1; 
        // 上界
        int right = intervals.size();
        while(left < right){
            int mid = left + (right - left) / 2;
            if(canSatisfy(intervals, mid)){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
    public boolean canSatisfy(List<Interval> intervals, int num){
        Queue<Interval> minHeap = new PriorityQueue<>(new Comparator<Interval>(){
            public int compare(Interval o1, Interval o2){
                return o1.end - o2.end;
            }
        });
        int start = 0;
        for(int i = 0; i < num; i++){
            minHeap.add(intervals.get(i));
        }
        for(int i = num; i < intervals.size(); i++){
            // 上段时间的终止时刻,亦为当前时间段中的起始时刻
            start  = minHeap.remove().end;
            if(intervals.get(i).start < start){
                return false;
            }
            minHeap.add(intervals.get(i));
        }
        return true;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法细节系列(26):区间
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/72841132
用户1147447
2019/05/26
4790
会议室919、920、1897
题目链接:https://www.lintcode.com/problem/920
翎野君
2023/05/12
2070
最小堆的魅力!思路清晰求解「至少需要多少间会议室」
今天分享的题目来源于 LeetCode 第 252 号问题:会议室。这是一道题目很好理解,解法也比较多的题目,可以很好的复习 最小堆 这种数据结构。
五分钟学算法
2019/09/27
1K0
LeetCode 253. 会议室 II(贪心+优先队列)
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei), 为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
Michael阿明
2020/07/13
6.9K0
测试面试 | Python 算法与数据结构面试题系列二(附答案)
⬆️ 关注 @霍格沃兹测试学院 公众号,回复「面试」,领取 BAT 大厂测试面试真题专辑。
霍格沃兹测试开发
2020/12/23
4920
<贪心>会议室宣讲&&哈弗曼树&&切金条&&LeetCode502IPO
一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组, 里面 是一个个具体的项目), 你来安排宣讲的日程, 要求会议室进行 的宣讲的场次最多。 返回这个最多的宣讲场次。
大学里的混子
2019/02/21
6280
每天一道leetcode56-合并区间
题目 每天一道leetcode56-合并区间 分类:数组 中文链接: https://leetcode-cn.com/problems/merge-intervals/description/ 英文链接 https://leetcode.com/problems/merge-intervals/description/ 题目详述 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]]
乔戈里
2019/09/17
3090
LintCode-30. 插入区间
给出一个无重叠的按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
悠扬前奏
2019/05/31
4200
回溯/贪心高频题
"有关递归的算法,都离不开“树”的遍历这一抽象模型。只不过对于不同的算法,在前(中)后序遍历的时候,所做的事不同而已。 "
王脸小
2019/10/28
1.4K0
56. 合并区间
解:题目不难,注意会出现[[1,8],[4,5]…]这种情况,比较特殊用Math.max比较一下
张伦聪zhangluncong
2022/10/26
1710
数字问题-LeetCode 435、436、441、442、443、445、448(数字)
示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。
算法工程师之路
2020/02/13
5870
LeetCode 252. 会议室(排序)
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),请你判断一个人是否能够参加这里面的全部会议。
Michael阿明
2020/07/13
2.3K0
【leetcode】拆解与整合:分治并归的算法逻辑
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
用户11288949
2025/03/30
990
【leetcode】拆解与整合:分治并归的算法逻辑
时间调度问题的千层套路
力扣上类似的问题是会员题目,你可能没办法做,但对于这种经典的算法题,掌握思路还是必要的。
labuladong
2021/09/23
1.2K0
软件测试面试中都会问到哪些关于Python的问题?
答:Python是一门语法简洁优美, 功能强大无比, 应用领域非常广泛, 具有强大完备的第三方库,它是一门强类型的可移植、可扩展、可嵌入的解释型编程语言,属于动态语言。
霍格沃兹测试开发
2020/12/17
7730
最小区间
你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。
你的益达
2020/08/05
4710
有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
你的益达
2020/08/05
6580
【Leetcode】56. 合并区间
这个题的基本思路就是当两个区间有重合的时候,第一个区间的end >= 第二个区间的start。前提是我们都是从小到大排好序的。那么合并完的区间就是[第一个区间的start, 第二个区间的end]。遍历结束,即可得到最终的解。
Leetcode名企之路
2018/09/12
6780
【代码随想录】二刷-贪心算法
贪心算法 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。 贪心算法一般分为如下四步: 将问题分为若干子问题 找出合适的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 ---- 455. 分发饼干 方法1: 充分利用每个饼干的大小,用大块的饼干优先喂饱大胃口的孩子 class Solution { public:
半生瓜的blog
2023/05/13
4350
【代码随想录】二刷-贪心算法
程序员进阶之算法练习(三十二)LeetCode专场
题目链接 题目大意: 给出一个链表RandomListNode *next, *random; 每个节点有int值,有两个指针,一个指向下一个节点,一个指向链表的任意节点; 现在实现一个深度复制,复制节点的next、random、还有int值;
落影
2018/08/10
4510
相关推荐
算法细节系列(26):区间
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验