[中等] 253. 會(huì)議室 II

歡迎關(guān)注 leetcode 專欄

題目

給定一個(gè)會(huì)議時(shí)間安排的數(shù)組爬舰,每個(gè)會(huì)議時(shí)間都會(huì)包括開始和結(jié)束的時(shí)間 [[s1,e1],[s2,e2],...] (si < ei),為避免會(huì)議沖突,同時(shí)要考慮充分利用會(huì)議室資源,請(qǐng)你計(jì)算至少需要多少間會(huì)議室,才能滿足這些會(huì)議安排。

示例 1:

輸入: [[0, 30],[5, 10],[15, 20]]
輸出: 2

示例 2:

輸入: [[7,10],[2,4]]
輸出: 1

鏈接:https://leetcode-cn.com/problems/meeting-rooms-ii

解法

常規(guī)解法

思路就是:

  1. 對(duì)所有會(huì)議,按照開始時(shí)間排升序俏站;
  2. 用貪心算法,每來(lái)一個(gè)新的會(huì)議痊土,遍歷所有會(huì)議室肄扎,如果有空的會(huì)議室(該會(huì)議室的結(jié)束時(shí)間早于等于當(dāng)前會(huì)議的開始時(shí)間),則作為當(dāng)前最優(yōu)的選擇施戴,更新該會(huì)議室的結(jié)束時(shí)間反浓,并停止循環(huán)
  3. 如果一個(gè)可用的會(huì)議室都沒有,則新增會(huì)議室赞哗,并更新該會(huì)議室的結(jié)束時(shí)間雷则。
class Solution:
    def minMeetingRooms(self, intervals: List[List[int]]) -> int:
        rooms = []  # 記錄各會(huì)議室的結(jié)束時(shí)間
        meetings = sorted(intervals, key=lambda x: x[0])  # 按開始時(shí)間升序
        for meeting in meetings:
            find = False
            for index, end_time in enumerate(rooms):
                # 找到滿足結(jié)束時(shí)間早于當(dāng)前會(huì)議開始時(shí)間的會(huì)議室,并更新會(huì)議室的時(shí)間表
                if end_time <= meeting[0]:
                    rooms[index] = meeting[1]
                    find = True
                    break
            # 如果沒找到肪笋,則新增會(huì)議室
            if not find:
                rooms.append(meeting[1])
        return len(rooms)

時(shí)間復(fù)雜度為 O(N^2)月劈,分為兩個(gè)部分:

  1. 對(duì)長(zhǎng)度為 N 的會(huì)議進(jìn)行排序度迂,復(fù)雜度為 O(N*logN)
    1, 對(duì) N 個(gè)會(huì)議分別執(zhí)行查找和插入操作猜揪,最差情況下任意兩兩會(huì)議的時(shí)間都是沖突的惭墓,那么對(duì)第 i 個(gè)會(huì)議的查找次數(shù)為 i 次,1+2+...+n=n(n+1)/2而姐,全程共插入 n(n+1)/2 次嵌灰,插入 N 次喂窟,最差復(fù)雜度為 O(N^2) 箱熬。

空間復(fù)雜度O(n)春畔,就看 rooms 的長(zhǎng)度,最好的情況下 O(1)政鼠,最差的情況下 O(n)风瘦。

最小堆解法

import heapq

class Solution:
    def minMeetingRooms(self, intervals: list) -> int:
        rooms = []  # 記錄各會(huì)議室的最早結(jié)束時(shí)間
        meetings = sorted(intervals, key=lambda x: x[0])  # 按開始時(shí)間升序
        for meeting in meetings:
            # 如果最早結(jié)束的會(huì)議室的結(jié)束時(shí)間比會(huì)議室時(shí)間要早,則先關(guān)閉該會(huì)議室
            if rooms and rooms[0] <= meeting[0]:
                heapq.heappop(rooms)
            # 插入新的會(huì)議室到最小堆
            heapq.heappush(rooms, meeting[1])
        return len(rooms)

時(shí)間復(fù)雜度為O(N*logN)公般,分為兩個(gè)部分:

  1. 對(duì)長(zhǎng)度為 N 的會(huì)議進(jìn)行排序万搔,復(fù)雜度為 O(N*logN)
  2. 對(duì) N 個(gè)會(huì)議分別執(zhí)行彈出和插入操作,最差情況下任意兩兩會(huì)議的時(shí)間都是沖突的官帘,每次彈出的復(fù)雜度為 1瞬雹,每次插入的復(fù)雜度為 O(logN),N 個(gè)會(huì)議室的總復(fù)雜度為 O(N*logN)

空間復(fù)雜度O(n)刽虹,就看 rooms 的長(zhǎng)度挖炬,最好的情況下 O(1),最差的情況下 O(n)状婶。

優(yōu)先隊(duì)列解法

from queue import PriorityQueue

class Solution:
    def minMeetingRooms(self, intervals: list) -> int:
        rooms = PriorityQueue()
        meetings = sorted(intervals, key=lambda x: x[0])  # 按開始時(shí)間升序
        for meeting in meetings:
            # 如果最早結(jié)束的會(huì)議室的結(jié)束時(shí)間比會(huì)議室時(shí)間要早,則先關(guān)閉該會(huì)議室
            if rooms.qsize() and rooms.queue[0] <= meeting[0]:
                rooms.get()
            # 插入新的會(huì)議室到優(yōu)先隊(duì)列
            rooms.put(meeting[1])
        return rooms.qsize()

雖然用優(yōu)先隊(duì)列來(lái)實(shí)現(xiàn)馅巷,復(fù)雜度跟最小堆是一樣的膛虫,但是算法實(shí)際執(zhí)行的時(shí)候,耗時(shí)比較長(zhǎng)钓猬,不知道是否是內(nèi)部實(shí)現(xiàn)的時(shí)候有其他額外邏輯

更多刷題稍刀,盡在 leetcode 專欄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敞曹,隨后出現(xiàn)的幾起案子账月,更是在濱河造成了極大的恐慌,老刑警劉巖澳迫,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件局齿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橄登,警方通過查閱死者的電腦和手機(jī)抓歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門讥此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谣妻,你說(shuō)我怎么就攤上這事萄喳。” “怎么了蹋半?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵他巨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我减江,道長(zhǎng)染突,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任您市,我火速辦了婚禮觉痛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茵休。我一直安慰自己薪棒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布榕莺。 她就那樣靜靜地躺著俐芯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钉鸯。 梳的紋絲不亂的頭發(fā)上吧史,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音唠雕,去河邊找鬼贸营。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岩睁,可吹牛的內(nèi)容都是我干的钞脂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼捕儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冰啃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刘莹,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阎毅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后点弯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇调,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年抢肛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肃拜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴腌。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燃领,靈堂內(nèi)的尸體忽然破棺而出士聪,到底是詐尸還是另有隱情,我是刑警寧澤猛蔽,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布剥悟,位于F島的核電站,受9級(jí)特大地震影響曼库,放射性物質(zhì)發(fā)生泄漏区岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一毁枯、第九天 我趴在偏房一處隱蔽的房頂上張望慈缔。 院中可真熱鬧,春花似錦种玛、人聲如沸藐鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娱节。三九已至,卻和暖如春祭示,著一層夾襖步出監(jiān)牢的瞬間肄满,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工质涛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠歉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓汇陆,卻偏偏與公主長(zhǎng)得像轧抗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞬测,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361