0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

时间调度问题的千层套路

算法与数据结构 来源:labuladong 作者:labuladong 2022-08-08 14:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前面试,被问到一道非常经典且非常实用的算法题目:会议室安排问题。

力扣上类似的问题是会员题目,你可能没办法做,但对于这种经典的算法题,掌握思路还是必要的。

先说下题目,给你输入若干形如[begin, end]的区间,代表若干会议的开始时间和结束时间,请你计算至少需要申请多少间会议室。

函数签名如下:

//返回需要申请的会议室数量
intminMeetingRooms(int[][]meetings);

比如给你输入meetings = [[0,30],[5,10],[15,20]],算法应该返回 2,因为后两个会议和第一个会议时间是冲突的,至少申请两个会议室才能让所有会议顺利进行。

如果会议之间的时间有重叠,那就得额外申请会议室来开会,想求至少需要多少间会议室,就是让你计算同一时刻最多有多少会议在同时进行。

换句话说,如果把每个会议的起止时间看做一个线段区间,那么题目就是让你求最多有几个重叠区间,仅此而已。

对于这种时间安排的问题,本质上讲就是区间调度问题,十有八九得排序,然后找规律来解决。

题目延伸

我们之前写过很多区间调度相关的文章,这里就顺便帮大家梳理一下这类问题的思路:

第一个场景,假设现在只有一个会议室,还有若干会议,你如何将尽可能多的会议安排到这个会议室里?

这个问题需要将这些会议(区间)按结束时间(右端点)排序,然后进行处理,详见前文贪心算法做时间管理

第二个场景,给你若干较短的视频片段,和一个较长的视频片段,请你从较短的片段中尽可能少地挑出一些片段,拼接出较长的这个片段。

这个问题需要将这些视频片段(区间)按开始时间(左端点)排序,然后进行处理,详见前文剪视频剪出一个贪心算法

第三个场景,给你若干区间,其中可能有些区间比较短,被其他区间完全覆盖住了,请你删除这些被覆盖的区间。

这个问题需要将这些区间按左端点排序,然后就能找到并删除那些被完全覆盖的区间了,详见前文删除覆盖区间

第四个场景,给你若干区间,请你将所有有重叠部分的区间进行合并。

这个问题需要将这些区间按左端点排序,方便找出存在重叠的区间,详见前文合并重叠区间

第五个场景,有两个部门同时预约了同一个会议室的若干时间段,请你计算会议室的冲突时段。

这个问题就是给你两组区间列表,请你找出这两组区间的交集,这需要你将这些区间按左端点排序,详见前文区间交集问题

第六个场景,假设现在只有一个会议室,还有若干会议,如何安排会议才能使这个会议室的闲置时间最少?

这个问题需要动动脑筋,说白了这就是个 0-1 背包问题的变形:

会议室可以看做一个背包,每个会议可以看做一个物品,物品的价值就是会议的时长,请问你如何选择物品(会议)才能最大化背包中的价值(会议室的使用时长)?

当然,这里背包的约束不是一个最大重量,而是各个物品(会议)不能互相冲突。把各个会议按照结束时间进行排序,然后参考前文0-1 背包问题详解的思路即可解决,等我以后有机会可以写一写这个问题。

第七个场景,就是本文想讲的场景,给你若干会议,让你合理申请会议室。

好了,举例了这么多,来看看今天的这个问题如何解决。

题目分析

重复一下题目的本质:

给你输入若干时间区间,让你计算同一时刻「最多」有几个区间重叠

题目的关键点在于,给你任意一个时刻,你是否能够说出这个时刻有几个会议在同时进行?

如果可以做到,那我遍历所有的时刻,找个最大值,就是需要申请的会议室数量。

有没有一种数据结构或者算法,给我输入若干区间,我能知道每个位置有多少个区间重叠?

老读者肯定可以联想到之前说过的一个算法技巧:差分数组技巧

把时间线想象成一个初始值为 0 的数组,每个时间区间[i, j]就相当于一个子数组,这个时间区间有一个会议,那我就把这个子数组中的元素都加一。

最后,每个时刻有几个会议我不就知道了吗?我遍历整个数组,不就知道至少需要几间会议室了吗?

举例来说,如果输入meetings = [[0,30],[5,10],[15,20]],那么我们就给数组中[0,30],[5,10],[15,20]这几个索引区间分别加一,最后遍历数组,求个最大值就行了。

还记得吗,差分数组技巧可以在 O(1) 时间对整个区间的元素进行加减,所以可以拿来解决这道题。

不过,这个解法的效率不算高,所以我这里不准备具体写差分数组的解法,参照差分数组技巧的原理,有兴趣的读者可以自己尝试去实现。

基于差分数组的思路,我们可以推导出一种更高效,更优雅的解法

我们首先把这些会议的时间区间进行投影:

208311d6-16c9-11ed-ba43-dac502259ad0.jpg

红色的点代表每个会议的开始时间点,绿色的点代表每个会议的结束时间点。

现在假想有一条带着计数器的线,在时间线上从左至右进行扫描,每遇到红色的点,计数器count加一,每遇到绿色的点,计数器count减一:

20943a06-16c9-11ed-ba43-dac502259ad0.jpg

这样一来,每个时刻有多少个会议在同时进行,就是计数器count的值,count的最大值,就是需要申请的会议室数量

对差分数组技巧熟悉的读者一眼就能看出来了,这个扫描线其实就是差分数组的遍历过程,所以我们说这是差分数组技巧衍生出来的解法。

代码实现

那么,如何写代码实现这个扫描的过程呢?

首先,对区间进行投影,就相当于对每个区间的起点和终点分别进行排序:

20aa2898-16c9-11ed-ba43-dac502259ad0.jpg

intminMeetingRooms(int[][]meetings){
intn=meetings.length;
int[]begin=newint[n];
int[]end=newint[n];
//把左端点和右端点单独拿出来
for(inti=0;i< n; i++) {
        begin[i] = meetings[i][0];
end[i]=meetings[i][1];
}
//排序后就是图中的红点
Arrays.sort(begin);
//排序后就是图中的绿点
Arrays.sort(end);

//...
}

然后就简单了,扫描线从左向右前进,遇到红点就对计数器加一,遇到绿点就对计数器减一,计数器count的最大值就是答案:

intminMeetingRooms(int[][]meetings){
intn=meetings.length;
int[]begin=newint[n];
int[]end=newint[n];
for(inti=0;i< n; i++) {
        begin[i] = meetings[i][0];
end[i]=meetings[i][1];
}
Arrays.sort(begin);
Arrays.sort(end);

//扫描过程中的计数器
intcount=0;
//双指针技巧
intres=0,i=0,j=0;
while(i< n && j < n) {
        if(begin[i]< end[j]) {
            //扫描到一个红点
count++;
i++;
}else{
//扫描到一个绿点
count--;
j++;
}
//记录扫描过程中的最大值
res=Math.max(res,count);
}

returnres;
}

这里使用的是双指针技巧,你可以认为指针i就是那根扫描线,根据i, j的相对位置就可以模拟扫描线前进的过程。

至此,这道题就做完了。当然,这个题目也可以变形,比如给你若干会议,问你k个会议室够不够用,其实你套用本文的解法代码,也可以很轻松解决。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4762

    浏览量

    97189
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27117

原文标题:时间调度问题的千层套路

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    freertos关闭任务调度的方法

    #include \"FreeRTOS.h\" #include \"task.h\" /* 关闭任务调度 */ void
    发表于 11-17 06:47

    FreeRTOS任务调度及优先级问题

    大家好,最近本人在学习FreeRTOS ,之前有过一些裸机开发的经验,目前知道了FreeRTOS的任务是基于时间片轮转来调度,也就是知道了任务会基于各个时间片来运行。 于是联想了如果有一些外设芯片
    发表于 11-06 02:18

    时间频率标准源有什么功能

    时间频率
    西安同步电子科技有限公司
    发布于 :2025年11月04日 17:58:08

    方科技助力成都世运会交通保障

    8月17日,第十二届世界运动会圆满闭幕。方科技与成都交投智慧交通集团组建专业团队合力打造成都世运会专车指挥调度系统,采用动态调度模型优化专车班次与路线,零事故圆满完成了本次交通专项保障任务。
    的头像 发表于 08-21 10:59 947次阅读

    毫秒不差的背后:北斗时间服务器如何重塑现代网络同步?

    在金融交易、电力调度、5G通信等领域,1毫秒的时间误差可能导致连锁反应。而北斗时间服务器的出现,正悄然改变着全球时间同步的格局。
    的头像 发表于 08-13 15:40 395次阅读
    毫秒不差的背后:北斗<b class='flag-5'>时间</b>服务器如何重塑现代网络同步?

    御控县级供水调度系统:数字化整合,构建全流程智能调度体系

    御控县级供水调度系统的建设以数据整合和智能决策为核心,通过物联网、大数据等技术,实现从水源地到用户终端的全流程监控与优化调度,提升供水安全性和经济性。
    的头像 发表于 07-17 15:41 336次阅读
    御控县级供水<b class='flag-5'>调度</b>系统:数字化整合,构建全流程智能<b class='flag-5'>调度</b>体系

    航天宏图应急指挥调度系统介绍

    影响。在突发事件发生时,时间就是生命,应急响应快一秒,风险就少一分,损失就小一些。航天宏图应急指挥调度系统应运而生,为应急管理注入“智慧基因”,打造看得见、调得动、打得赢的应急指挥中枢。
    的头像 发表于 07-16 16:56 719次阅读

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1457次阅读
    深度剖析 RT-Thread 线程<b class='flag-5'>调度</b>流程

    详解Kubernetes中的Pod调度亲和性

    在 Kubernetes(K8s)中,Pod 调度亲和性(Affinity) 是一种高级调度策略,用于控制 Pod 与节点(Node)或其他 Pod 之间的关联(亲和)或反关联(反亲和)关系。通过亲和性规则,管理员可以更精细地控制 Pod 的
    的头像 发表于 06-07 13:56 721次阅读

    具有增益调度切换增益的永磁同步电机滑模控制

    纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:具有增益调度切换增益的永磁同步电机滑模控制.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 06-05 11:25

    北斗时间同步时钟:为现代生活提供精准时间

    时间,是我们日常生活中不可或缺的一部分。从手机上的时间显示到交通信号灯的控制,从金融交易的记录到电力系统的调度时间的准确性直接影响着社会的运转效率。而北斗
    的头像 发表于 05-30 14:23 843次阅读
    北斗<b class='flag-5'>时间</b>同步时钟:为现代生活提供精准<b class='flag-5'>时间</b>

    安全生产调度管理系统的核心功能模块

    调度、决策支持的全链条安全管理体系。 一、系统基本架构 安全生产调度 管理系统采用"云-边-端"协同的三技术架构。感知由部署在生产现场的各类监测设备组成,包括气体传感器、振动探头、
    的头像 发表于 05-16 15:25 457次阅读

    GPU显卡维修避坑指南:手把手教你识别行业套路

    你的显卡维修被“套路”过吗?“一块H100显卡维修报价5万?修完3个月又坏!”你是否也遇到过——高价采购的显卡突然故障,返厂维修耗时数月,第三方服务商张口就是“核心损坏,必须换新”?在算力需求激增
    的头像 发表于 04-02 20:31 3236次阅读
    GPU显卡维修避坑指南:手把手教你识别行业<b class='flag-5'>套路</b>!

    简单认识全调度以太网技术

    调度以太网技术(Global Scheduling Ethernet,GSE)——基于报文容器PKTC转发和负载均衡,并实现全局调度
    的头像 发表于 01-15 14:31 1246次阅读
    简单认识全<b class='flag-5'>调度</b>以太网技术

    车队运营调度管理系统

    车队运营调度管理系统作为无人驾驶车队的云端大脑,承担了打通业务和无人驾驶车队的重任。经纬恒润车队运营调度管理系统包含业务对接、车辆调度、作业管理引擎、交通
    的头像 发表于 01-09 10:25 1276次阅读
    车队运营<b class='flag-5'>调度</b>管理系统