91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

時(shí)間調(diào)度問題的千層套路

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:labuladong ? 作者:labuladong ? 2022-08-08 14:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

之前面試,被問到一道非常經(jīng)典且非常實(shí)用的算法題目:會(huì)議室安排問題。

力扣上類似的問題是會(huì)員題目,你可能沒辦法做,但對(duì)于這種經(jīng)典的算法題,掌握思路還是必要的。

先說下題目,給你輸入若干形如[begin, end]的區(qū)間,代表若干會(huì)議的開始時(shí)間和結(jié)束時(shí)間,請(qǐng)你計(jì)算至少需要申請(qǐng)多少間會(huì)議室。

函數(shù)簽名如下:

//返回需要申請(qǐng)的會(huì)議室數(shù)量
intminMeetingRooms(int[][]meetings);

比如給你輸入meetings = [[0,30],[5,10],[15,20]],算法應(yīng)該返回 2,因?yàn)楹髢蓚€(gè)會(huì)議和第一個(gè)會(huì)議時(shí)間是沖突的,至少申請(qǐng)兩個(gè)會(huì)議室才能讓所有會(huì)議順利進(jìn)行。

如果會(huì)議之間的時(shí)間有重疊,那就得額外申請(qǐng)會(huì)議室來開會(huì),想求至少需要多少間會(huì)議室,就是讓你計(jì)算同一時(shí)刻最多有多少會(huì)議在同時(shí)進(jìn)行。

換句話說,如果把每個(gè)會(huì)議的起止時(shí)間看做一個(gè)線段區(qū)間,那么題目就是讓你求最多有幾個(gè)重疊區(qū)間,僅此而已。

對(duì)于這種時(shí)間安排的問題,本質(zhì)上講就是區(qū)間調(diào)度問題,十有八九得排序,然后找規(guī)律來解決。

題目延伸

我們之前寫過很多區(qū)間調(diào)度相關(guān)的文章,這里就順便幫大家梳理一下這類問題的思路:

第一個(gè)場(chǎng)景,假設(shè)現(xiàn)在只有一個(gè)會(huì)議室,還有若干會(huì)議,你如何將盡可能多的會(huì)議安排到這個(gè)會(huì)議室里?

這個(gè)問題需要將這些會(huì)議(區(qū)間)按結(jié)束時(shí)間(右端點(diǎn))排序,然后進(jìn)行處理,詳見前文貪心算法做時(shí)間管理。

第二個(gè)場(chǎng)景,給你若干較短的視頻片段,和一個(gè)較長的視頻片段,請(qǐng)你從較短的片段中盡可能少地挑出一些片段,拼接出較長的這個(gè)片段。

這個(gè)問題需要將這些視頻片段(區(qū)間)按開始時(shí)間(左端點(diǎn))排序,然后進(jìn)行處理,詳見前文剪視頻剪出一個(gè)貪心算法

第三個(gè)場(chǎng)景,給你若干區(qū)間,其中可能有些區(qū)間比較短,被其他區(qū)間完全覆蓋住了,請(qǐng)你刪除這些被覆蓋的區(qū)間。

這個(gè)問題需要將這些區(qū)間按左端點(diǎn)排序,然后就能找到并刪除那些被完全覆蓋的區(qū)間了,詳見前文刪除覆蓋區(qū)間

第四個(gè)場(chǎng)景,給你若干區(qū)間,請(qǐng)你將所有有重疊部分的區(qū)間進(jìn)行合并。

這個(gè)問題需要將這些區(qū)間按左端點(diǎn)排序,方便找出存在重疊的區(qū)間,詳見前文合并重疊區(qū)間。

第五個(gè)場(chǎng)景,有兩個(gè)部門同時(shí)預(yù)約了同一個(gè)會(huì)議室的若干時(shí)間段,請(qǐng)你計(jì)算會(huì)議室的沖突時(shí)段。

這個(gè)問題就是給你兩組區(qū)間列表,請(qǐng)你找出這兩組區(qū)間的交集,這需要你將這些區(qū)間按左端點(diǎn)排序,詳見前文區(qū)間交集問題。

第六個(gè)場(chǎng)景,假設(shè)現(xiàn)在只有一個(gè)會(huì)議室,還有若干會(huì)議,如何安排會(huì)議才能使這個(gè)會(huì)議室的閑置時(shí)間最少?

這個(gè)問題需要?jiǎng)觿?dòng)腦筋,說白了這就是個(gè) 0-1 背包問題的變形:

會(huì)議室可以看做一個(gè)背包,每個(gè)會(huì)議可以看做一個(gè)物品,物品的價(jià)值就是會(huì)議的時(shí)長,請(qǐng)問你如何選擇物品(會(huì)議)才能最大化背包中的價(jià)值(會(huì)議室的使用時(shí)長)?

當(dāng)然,這里背包的約束不是一個(gè)最大重量,而是各個(gè)物品(會(huì)議)不能互相沖突。把各個(gè)會(huì)議按照結(jié)束時(shí)間進(jìn)行排序,然后參考前文0-1 背包問題詳解的思路即可解決,等我以后有機(jī)會(huì)可以寫一寫這個(gè)問題。

第七個(gè)場(chǎng)景,就是本文想講的場(chǎng)景,給你若干會(huì)議,讓你合理申請(qǐng)會(huì)議室。

好了,舉例了這么多,來看看今天的這個(gè)問題如何解決。

題目分析

重復(fù)一下題目的本質(zhì):

給你輸入若干時(shí)間區(qū)間,讓你計(jì)算同一時(shí)刻「最多」有幾個(gè)區(qū)間重疊

題目的關(guān)鍵點(diǎn)在于,給你任意一個(gè)時(shí)刻,你是否能夠說出這個(gè)時(shí)刻有幾個(gè)會(huì)議在同時(shí)進(jìn)行?

如果可以做到,那我遍歷所有的時(shí)刻,找個(gè)最大值,就是需要申請(qǐng)的會(huì)議室數(shù)量。

有沒有一種數(shù)據(jù)結(jié)構(gòu)或者算法,給我輸入若干區(qū)間,我能知道每個(gè)位置有多少個(gè)區(qū)間重疊?

老讀者肯定可以聯(lián)想到之前說過的一個(gè)算法技巧:差分?jǐn)?shù)組技巧。

把時(shí)間線想象成一個(gè)初始值為 0 的數(shù)組,每個(gè)時(shí)間區(qū)間[i, j]就相當(dāng)于一個(gè)子數(shù)組,這個(gè)時(shí)間區(qū)間有一個(gè)會(huì)議,那我就把這個(gè)子數(shù)組中的元素都加一。

最后,每個(gè)時(shí)刻有幾個(gè)會(huì)議我不就知道了嗎?我遍歷整個(gè)數(shù)組,不就知道至少需要幾間會(huì)議室了嗎?

舉例來說,如果輸入meetings = [[0,30],[5,10],[15,20]],那么我們就給數(shù)組中[0,30],[5,10],[15,20]這幾個(gè)索引區(qū)間分別加一,最后遍歷數(shù)組,求個(gè)最大值就行了。

還記得嗎,差分?jǐn)?shù)組技巧可以在 O(1) 時(shí)間對(duì)整個(gè)區(qū)間的元素進(jìn)行加減,所以可以拿來解決這道題。

不過,這個(gè)解法的效率不算高,所以我這里不準(zhǔn)備具體寫差分?jǐn)?shù)組的解法,參照差分?jǐn)?shù)組技巧的原理,有興趣的讀者可以自己嘗試去實(shí)現(xiàn)。

基于差分?jǐn)?shù)組的思路,我們可以推導(dǎo)出一種更高效,更優(yōu)雅的解法。

我們首先把這些會(huì)議的時(shí)間區(qū)間進(jìn)行投影:

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

紅色的點(diǎn)代表每個(gè)會(huì)議的開始時(shí)間點(diǎn),綠色的點(diǎn)代表每個(gè)會(huì)議的結(jié)束時(shí)間點(diǎn)。

現(xiàn)在假想有一條帶著計(jì)數(shù)器的線,在時(shí)間線上從左至右進(jìn)行掃描,每遇到紅色的點(diǎn),計(jì)數(shù)器count加一,每遇到綠色的點(diǎn),計(jì)數(shù)器count減一:

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

這樣一來,每個(gè)時(shí)刻有多少個(gè)會(huì)議在同時(shí)進(jìn)行,就是計(jì)數(shù)器count的值,count的最大值,就是需要申請(qǐng)的會(huì)議室數(shù)量

對(duì)差分?jǐn)?shù)組技巧熟悉的讀者一眼就能看出來了,這個(gè)掃描線其實(shí)就是差分?jǐn)?shù)組的遍歷過程,所以我們說這是差分?jǐn)?shù)組技巧衍生出來的解法。

代碼實(shí)現(xiàn)

那么,如何寫代碼實(shí)現(xiàn)這個(gè)掃描的過程呢?

首先,對(duì)區(qū)間進(jìn)行投影,就相當(dāng)于對(duì)每個(gè)區(qū)間的起點(diǎn)和終點(diǎn)分別進(jìn)行排序:

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

intminMeetingRooms(int[][]meetings){
intn=meetings.length;
int[]begin=newint[n];
int[]end=newint[n];
//把左端點(diǎn)和右端點(diǎn)單獨(dú)拿出來
for(inti=0;i0];
end[i]=meetings[i][1];
}
//排序后就是圖中的紅點(diǎn)
Arrays.sort(begin);
//排序后就是圖中的綠點(diǎn)
Arrays.sort(end);

//...
}

然后就簡單了,掃描線從左向右前進(jìn),遇到紅點(diǎn)就對(duì)計(jì)數(shù)器加一,遇到綠點(diǎn)就對(duì)計(jì)數(shù)器減一,計(jì)數(shù)器count的最大值就是答案:

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

//掃描過程中的計(jì)數(shù)器
intcount=0;
//雙指針技巧
intres=0,i=0,j=0;
while(iif(begin[i]//掃描到一個(gè)紅點(diǎn)
count++;
i++;
}else{
//掃描到一個(gè)綠點(diǎn)
count--;
j++;
}
//記錄掃描過程中的最大值
res=Math.max(res,count);
}

returnres;
}

這里使用的是雙指針技巧,你可以認(rèn)為指針i就是那根掃描線,根據(jù)i, j的相對(duì)位置就可以模擬掃描線前進(jìn)的過程。

至此,這道題就做完了。當(dāng)然,這個(gè)題目也可以變形,比如給你若干會(huì)議,問你k個(gè)會(huì)議室夠不夠用,其實(shí)你套用本文的解法代碼,也可以很輕松解決。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4786

    瀏覽量

    98253
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27404

原文標(biāo)題:時(shí)間調(diào)度問題的千層套路

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Kubernetes Pod調(diào)度策略原理與落地指南

    Pod調(diào)度是Kubernetes的核心機(jī)制之一,決定了Pod最終運(yùn)行在哪個(gè)節(jié)點(diǎn)上。默認(rèn)調(diào)度器kube-scheduler通過一系列預(yù)選(Filtering)和優(yōu)選(Scoring)算法完成調(diào)度決策,但默認(rèn)行為在生產(chǎn)環(huán)境中往往不夠
    的頭像 發(fā)表于 02-27 11:08 ?207次閱讀

    數(shù)字賦能能源:AcrelEMS 解鎖微電網(wǎng)智能調(diào)度,引領(lǐng)行業(yè)管理變革

    全方位的能源監(jiān)控、智能化的調(diào)度管理,成為企業(yè)能源轉(zhuǎn)型的“智慧大腦”,為降本增效注入強(qiáng)勁動(dòng)力。 一、不止于監(jiān)控!這套系統(tǒng)重構(gòu)企業(yè)能源管理模式 安科瑞AcrelEMS系統(tǒng)采用分層分布式架構(gòu),從感知、傳輸到數(shù)據(jù)處理
    的頭像 發(fā)表于 01-04 16:33 ?299次閱讀
    數(shù)字賦能能源:AcrelEMS 解鎖微電網(wǎng)智能<b class='flag-5'>調(diào)度</b>,引領(lǐng)行業(yè)管理變革

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    ,背后都離不開內(nèi)核調(diào)度算法的精準(zhǔn)操控。今天,我們就從優(yōu)先級(jí)、調(diào)度算法、時(shí)間片分配到底層實(shí)現(xiàn),全方位拆解Linux內(nèi)核進(jìn)程調(diào)度的核心邏輯。 一、進(jìn)程調(diào)
    的頭像 發(fā)表于 12-24 07:05 ?4414次閱讀
    深入Linux內(nèi)核:進(jìn)程<b class='flag-5'>調(diào)度</b>的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    嵌入式基礎(chǔ)知識(shí)-系統(tǒng)調(diào)度

    何一個(gè)時(shí)間點(diǎn)只有一個(gè)任務(wù)處于運(yùn)行狀態(tài)。 就緒態(tài):所有任務(wù)都要轉(zhuǎn)換為就緒態(tài)后才能轉(zhuǎn)換為運(yùn)行態(tài),調(diào)度器決定哪一個(gè)就緒的任務(wù)將是下一個(gè)執(zhí)行的任務(wù)。 阻塞態(tài):處于阻塞態(tài)的任務(wù)是被動(dòng)的,可以被激活。 等待態(tài)
    發(fā)表于 12-16 08:15

    freertos關(guān)閉任務(wù)調(diào)度的方法

    #include \"FreeRTOS.h\" #include \"task.h\" /* 關(guān)閉任務(wù)調(diào)度 */ void
    發(fā)表于 11-17 06:47

    FreeRTOS任務(wù)調(diào)度及優(yōu)先級(jí)問題

    大家好,最近本人在學(xué)習(xí)FreeRTOS ,之前有過一些裸機(jī)開發(fā)的經(jīng)驗(yàn),目前知道了FreeRTOS的任務(wù)是基于時(shí)間片輪轉(zhuǎn)來調(diào)度,也就是知道了任務(wù)會(huì)基于各個(gè)時(shí)間片來運(yùn)行。 于是聯(lián)想了如果有一些外設(shè)芯片
    發(fā)表于 11-06 02:18

    時(shí)間頻率標(biāo)準(zhǔn)源有什么功能

    時(shí)間頻率
    西安同步電子科技有限公司
    發(fā)布于 :2025年11月04日 17:58:08

    方科技助力成都世運(yùn)會(huì)交通保障

    8月17日,第十二屆世界運(yùn)動(dòng)會(huì)圓滿閉幕。方科技與成都交投智慧交通集團(tuán)組建專業(yè)團(tuán)隊(duì)合力打造成都世運(yùn)會(huì)專車指揮調(diào)度系統(tǒng),采用動(dòng)態(tài)調(diào)度模型優(yōu)化專車班次與路線,零事故圓滿完成了本次交通專項(xiàng)保障任務(wù)。
    的頭像 發(fā)表于 08-21 10:59 ?1200次閱讀

    毫秒不差的背后:北斗時(shí)間服務(wù)器如何重塑現(xiàn)代網(wǎng)絡(luò)同步?

    在金融交易、電力調(diào)度、5G通信等領(lǐng)域,1毫秒的時(shí)間誤差可能導(dǎo)致連鎖反應(yīng)。而北斗時(shí)間服務(wù)器的出現(xiàn),正悄然改變著全球時(shí)間同步的格局。
    的頭像 發(fā)表于 08-13 15:40 ?557次閱讀
    毫秒不差的背后:北斗<b class='flag-5'>時(shí)間</b>服務(wù)器如何重塑現(xiàn)代網(wǎng)絡(luò)同步?

    御控縣級(jí)供水調(diào)度系統(tǒng):數(shù)字化整合,構(gòu)建全流程智能調(diào)度體系

    御控縣級(jí)供水調(diào)度系統(tǒng)的建設(shè)以數(shù)據(jù)整合和智能決策為核心,通過物聯(lián)網(wǎng)、大數(shù)據(jù)等技術(shù),實(shí)現(xiàn)從水源地到用戶終端的全流程監(jiān)控與優(yōu)化調(diào)度,提升供水安全性和經(jīng)濟(jì)性。
    的頭像 發(fā)表于 07-17 15:41 ?491次閱讀
    御控縣級(jí)供水<b class='flag-5'>調(diào)度</b>系統(tǒng):數(shù)字化整合,構(gòu)建全流程智能<b class='flag-5'>調(diào)度</b>體系

    航天宏圖應(yīng)急指揮調(diào)度系統(tǒng)介紹

    影響。在突發(fā)事件發(fā)生時(shí),時(shí)間就是生命,應(yīng)急響應(yīng)快一秒,風(fēng)險(xiǎn)就少一分,損失就小一些。航天宏圖應(yīng)急指揮調(diào)度系統(tǒng)應(yīng)運(yùn)而生,為應(yīng)急管理注入“智慧基因”,打造看得見、調(diào)得動(dòng)、打得贏的應(yīng)急指揮中樞。
    的頭像 發(fā)表于 07-16 16:56 ?993次閱讀

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線程初始化,啟動(dòng)調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1841次閱讀
    深度剖析 RT-Thread 線程<b class='flag-5'>調(diào)度</b>流程

    北斗時(shí)間同步時(shí)鐘:為現(xiàn)代生活提供精準(zhǔn)時(shí)間

    時(shí)間,是我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?。從手機(jī)上的時(shí)間顯示到交通信號(hào)燈的控制,從金融交易的記錄到電力系統(tǒng)的調(diào)度,時(shí)間的準(zhǔn)確性直接影響著社會(huì)的運(yùn)轉(zhuǎn)效率。而北斗
    的頭像 發(fā)表于 05-30 14:23 ?1199次閱讀
    北斗<b class='flag-5'>時(shí)間</b>同步時(shí)鐘:為現(xiàn)代生活提供精準(zhǔn)<b class='flag-5'>時(shí)間</b>

    安全生產(chǎn)調(diào)度管理系統(tǒng)的核心功能模塊

    調(diào)度、決策支持的全鏈條安全管理體系。 一、系統(tǒng)基本架構(gòu) 安全生產(chǎn)調(diào)度 管理系統(tǒng)采用"云-邊-端"協(xié)同的三技術(shù)架構(gòu)。感知由部署在生產(chǎn)現(xiàn)場(chǎng)的各類監(jiān)測(cè)設(shè)備組成,包括氣體傳感器、振動(dòng)探頭、
    的頭像 發(fā)表于 05-16 15:25 ?628次閱讀

    GPU顯卡維修避坑指南:手把手教你識(shí)別行業(yè)套路!

    你的顯卡維修被“套路”過嗎?“一塊H100顯卡維修報(bào)價(jià)5萬?修完3個(gè)月又壞!”你是否也遇到過——高價(jià)采購的顯卡突然故障,返廠維修耗時(shí)數(shù)月,第三方服務(wù)商張口就是“核心損壞,必須換新”?在算力需求激增
    的頭像 發(fā)表于 04-02 20:31 ?3950次閱讀
    GPU顯卡維修避坑指南:手把手教你識(shí)別行業(yè)<b class='flag-5'>套路</b>!