在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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;i0];
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;i0];
end[i]=meetings[i][1];
}
Arrays.sort(begin);
Arrays.sort(end);

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

returnres;
}

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

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

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4625

    瀏覽量

    93143
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25994

原文標題:時間調度問題的千層套路

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    簡單認識全調度以太網技術

    調度以太網技術(Global Scheduling Ethernet,GSE)——基于報文容器PKTC轉發和負載均衡,并實現全局調度
    的頭像 發表于 01-15 14:31 ?97次閱讀
    簡單認識全<b class='flag-5'>調度</b>以太網技術

    車隊運營調度管理系統

    車隊運營調度管理系統作為無人駕駛車隊的云端大腦,承擔了打通業務和無人駕駛車隊的重任。經緯恒潤車隊運營調度管理系統包含業務對接、車輛調度、作業管理引擎、交通
    的頭像 發表于 01-09 10:25 ?368次閱讀
    車隊運營<b class='flag-5'>調度</b>管理系統

    Linux之CPU調度策略和CPU親和性

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

    算力調度的基礎知識

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

    Linux調度器的核心scheduler_tick介紹

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

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

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

    深入探討Linux的進程調度

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

    車輛調度系統

    【銘跡創新】車輛調度系統分為隧道內和隧道外,隧道內應用UWB精確定位、RFID等技術,對隧道內施工車輛進行定位及區分行車道,綜合應用紅綠燈,LED屏幕、廣播等技術對隧道內車輛進行有效的施工調度。并可
    的頭像 發表于 05-31 15:59 ?574次閱讀
    車輛<b class='flag-5'>調度</b>系統

    TSMaster 自定義 LIN 調度表編程指導

    LIN(LocalInterconnectNetwork)協議調度表是用于LIN總線通信中的消息調度的一種機制,我們收到越來越多來自不同用戶希望能夠通過接口實現自定義LIN調度表的需求。所以在
    的頭像 發表于 05-11 08:21 ?718次閱讀
    TSMaster 自定義 LIN <b class='flag-5'>調度</b>表編程指導

    淺析FreeRTOS任務調度器的三種調度算法和應用

    FreeRTOS在MCU領域應用非常廣泛,今天就給大家講解一下FreeRTOS調度器中的三種調度算法,以及在瑞薩RZ/T2L MPU中的應用。
    的頭像 發表于 05-10 14:02 ?7714次閱讀
    淺析FreeRTOS任務<b class='flag-5'>調度</b>器的三種<b class='flag-5'>調度</b>算法和應用

    如何實現上位機靈活調度下位機?

    把下位機各個功能做成不同的函數,然后通過上位機來調度各個函數執行,比如說上位機發送一個協議讓LED1,LED2,LED3各亮一段時間,順序,時間由上位機發來的協議決定,不知道下位機怎么來實現這個邏輯。
    發表于 04-25 07:21

    什么是時間片輪轉調度時間片輪轉調度算法基本原理

    進程切換時間一定的情況下,如果時間片長度設定的越小時,這種浪費更明顯。所以,時間片長度與CPU利用率是一對不可調和的矛盾,必須處理好它們之間的關系。
    的頭像 發表于 03-22 14:54 ?3636次閱讀

    FreeRTOS任務調度器的三種調度算法講解(下)

    配置如下時,調度算法就會變成不帶時間片的搶占式調度
    的頭像 發表于 03-21 13:46 ?3070次閱讀
    FreeRTOS任務<b class='flag-5'>調度</b>器的三種<b class='flag-5'>調度</b>算法講解(下)

    鴻蒙OS 分布式任務調度

    鴻蒙OS 分布式任務調度概述 在 HarmonyO S中,分布式任務調度平臺對搭載 HarmonyOS 的多設備構筑的“超級虛擬終端”提供統一的組件管理能力,為應用定義統一的能力基線、接口
    的頭像 發表于 01-29 16:50 ?539次閱讀

    Linux的Deadline實時調度算法

    每個任務都有一個高精度定時器(sched_dl_entity 結構的 dl_timer 字段),其超時時間為任務的調度周期。當定時器觸發時,便會調用 dl_task_timer() 函數來處理定時器事件。
    發表于 01-24 13:44 ?942次閱讀
    Linux的Deadline實時<b class='flag-5'>調度</b>算法
    主站蜘蛛池模板: 天天操天天搞| 午夜精品久久久久久影视riav| 特黄色毛片| 五月亭亭六月丁香| 凸输偷窥xxxx自由视频| 色在线免费| 亲女乱h文小兰第一次| 嫩草影院在线入口| 黄色亚洲| 1000部啪啪| 色综合久久88| 天堂在线视频观看| 深爱激情婷婷| 农村苗族一级特黄a大片| 国内精品久久久久影院薰衣草| 成人网18免费下| 午夜亚洲国产精品福利| 免费一级特黄视频| 欧美成人在线网站| 可以免费看黄的网站| 国产午夜剧场| 久久精品乱子伦免费| 福利视频自拍偷拍| 在线中文字幕一区| 伊人久久天堂| 日韩一区二区三区在线| 久久精品女人天堂| 亚洲偷图色综合色就色| 精品福利| 亚1洲二区三区四区免费| 亚洲色图欧美色| 欧美日韩高清一本大道免费| 国产嫩草影院在线观看| 天天摸夜夜摸成人免费视频| 91综合网| 中文字幕在线色| 日本三级带日本三级带黄首页| 国产你懂的在线观看| 欧美视频图片| 亚洲福利秒拍一区二区| 泰剧天堂|