一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

函數(shù)簽名如下:

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

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

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

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

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

題目延伸

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

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

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

第二個場景,給你若干較短的視頻片段,和一個較長的視頻片段,請你從較短的片段中盡可能少地挑出一些片段,拼接出較長的這個片段。

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

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

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

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

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

第五個場景,有兩個部門同時預(yù)約了同一個會議室的若干時間段,請你計算會議室的沖突時段。

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

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

這個問題需要動動腦筋,說白了這就是個 0-1 背包問題的變形:

會議室可以看做一個背包,每個會議可以看做一個物品,物品的價值就是會議的時長,請問你如何選擇物品(會議)才能最大化背包中的價值(會議室的使用時長)?

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

第七個場景,就是本文想講的場景,給你若干會議,讓你合理申請會議室。

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

題目分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

紅色的點代表每個會議的開始時間點,綠色的點代表每個會議的結(jié)束時間點。

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

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

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

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

代碼實現(xiàn)

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

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

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

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ìn),遇到紅點就對計數(shù)器加一,遇到綠點就對計數(shù)器減一,計數(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);

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

returnres;
}

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

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

審核編輯 :李倩


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

    關(guān)注

    23

    文章

    4710

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    26558

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

    御控縣級供水調(diào)度系統(tǒng)的建設(shè)以數(shù)據(jù)整合和智能決策為核心,通過物聯(lián)網(wǎng)、大數(shù)據(jù)等技術(shù),實現(xiàn)從水源地到用戶終端的全流程監(jiān)控與優(yōu)化調(diào)度,提升供水安全性和經(jīng)濟(jì)性。
    的頭像 發(fā)表于 07-17 15:41 ?89次閱讀
    御控縣級供水<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ā)生時,時間就是生命,應(yīng)急響應(yīng)快一秒,風(fēng)險就少一分,損失就小一些。航天宏圖應(yīng)急指揮調(diào)度系統(tǒng)應(yīng)運而生,為應(yīng)急管理注入“智慧基因”,打造看得見、調(diào)得動、打得贏的應(yīng)急指揮中樞。
    的頭像 發(fā)表于 07-16 16:56 ?272次閱讀

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

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

    詳解Kubernetes中的Pod調(diào)度親和性

    在 Kubernetes(K8s)中,Pod 調(diào)度親和性(Affinity) 是一種高級調(diào)度策略,用于控制 Pod 與節(jié)點(Node)或其他 Pod 之間的關(guān)聯(lián)(親和)或反關(guān)聯(lián)(反親和)關(guān)系。通過親和性規(guī)則,管理員可以更精細(xì)地控制 Pod 的
    的頭像 發(fā)表于 06-07 13:56 ?230次閱讀

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

    時間,是我們?nèi)粘I钪胁豢苫蛉钡囊徊糠帧氖謾C(jī)上的時間顯示到交通信號燈的控制,從金融交易的記錄到電力系統(tǒng)的調(diào)度,時間的準(zhǔn)確性直接影響著社會的運轉(zhuǎn)效率。而北斗
    的頭像 發(fā)表于 05-30 14:23 ?325次閱讀
    北斗<b class='flag-5'>時間</b>同步時鐘:為現(xiàn)代生活提供精準(zhǔn)<b class='flag-5'>時間</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)場的各類監(jiān)測設(shè)備組成,包括氣體傳感器、振動探頭、
    的頭像 發(fā)表于 05-16 15:25 ?184次閱讀

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

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

    簡單認(rèn)識全調(diào)度以太網(wǎng)技術(shù)

    調(diào)度以太網(wǎng)技術(shù)(Global Scheduling Ethernet,GSE)——基于報文容器PKTC轉(zhuǎn)發(fā)和負(fù)載均衡,并實現(xiàn)全局調(diào)度。
    的頭像 發(fā)表于 01-15 14:31 ?604次閱讀
    簡單認(rèn)識全<b class='flag-5'>調(diào)度</b>以太網(wǎng)技術(shù)

    車隊運營調(diào)度管理系統(tǒng)

    車隊運營調(diào)度管理系統(tǒng)作為無人駕駛車隊的云端大腦,承擔(dān)了打通業(yè)務(wù)和無人駕駛車隊的重任。經(jīng)緯恒潤車隊運營調(diào)度管理系統(tǒng)包含業(yè)務(wù)對接、車輛調(diào)度、作業(yè)管理引擎、交通
    的頭像 發(fā)表于 01-09 10:25 ?909次閱讀
    車隊運營<b class='flag-5'>調(diào)度</b>管理系統(tǒng)

    電力系統(tǒng)中的電功率調(diào)度方法

    電力系統(tǒng)是現(xiàn)代社會的基礎(chǔ)設(shè)施,它為工業(yè)、商業(yè)和居民生活提供必需的電能。電功率調(diào)度作為電力系統(tǒng)運行管理的核心,其目的是在滿足電力需求的同時,確保電網(wǎng)的穩(wěn)定性和經(jīng)濟(jì)性。 1. 電功率調(diào)度的基本原理
    的頭像 發(fā)表于 12-09 11:02 ?1405次閱讀

    Linux之CPU調(diào)度策略和CPU親和性

    決定在某一時間點上哪個進(jìn)程在運行。調(diào)度器必須平衡幾個選項: 快速決定下一個該運行的進(jìn)程 進(jìn)程可以公平的活動 CPU 時間,但高優(yōu)先級的進(jìn)程會活動更多的運行時間并且可以搶占低優(yōu)先級的進(jìn)程
    的頭像 發(fā)表于 12-05 16:38 ?1118次閱讀
    Linux之CPU<b class='flag-5'>調(diào)度</b>策略和CPU親和性

    算力調(diào)度的基礎(chǔ)知識

    編者按 “算力調(diào)度”的概念,這幾年越來越多的被提及。剛聽到這個概念的時候,我腦海里一直拐不過彎。作為底層芯片出身的我,一直認(rèn)為:算力是硬件的服務(wù)器和集群,他在某個地方,就是固定的;根本就不存在算力
    的頭像 發(fā)表于 11-27 17:13 ?861次閱讀
    算力<b class='flag-5'>調(diào)度</b>的基礎(chǔ)知識

    Linux調(diào)度器的核心scheduler_tick介紹

    scheduler_tick在Linux內(nèi)核中扮演著關(guān)鍵角色。它不僅負(fù)責(zé)處理定時器中斷和更新系統(tǒng)時間,還記錄進(jìn)程的運行時間,并決定是否需要進(jìn)行任務(wù)切換。通過這些功能,scheduler_tick有效保障了系統(tǒng)的時間管理和任務(wù)
    的頭像 發(fā)表于 08-22 14:54 ?809次閱讀

    FPGA-5G通信算法的基本套路

    》、《信號與系統(tǒng)》、《數(shù)字通信原理》、《數(shù)字信號處理》、《現(xiàn)代信號處理》、《電磁場與電磁波》、《信息論與編碼》等一系列課程磨練過。歷經(jīng)帆,我們再來看看,通信系統(tǒng)的設(shè)計,套路在哪?從理論到實踐,有幾條街的距離
    發(fā)表于 08-15 17:34

    深入探討Linux的進(jìn)程調(diào)度

    Linux操作系統(tǒng)作為一個開源且廣泛應(yīng)用的操作系統(tǒng),其內(nèi)核設(shè)計包含了許多核心功能,而進(jìn)程調(diào)度器(Scheduler)就是其中一個至關(guān)重要的模塊。進(jìn)程調(diào)度器負(fù)責(zé)決定在任何給定的時刻哪個進(jìn)程可以運行
    的頭像 發(fā)表于 08-13 13:36 ?1293次閱讀
    深入探討Linux的進(jìn)程<b class='flag-5'>調(diào)度</b>器