📆行程安排 我的行事曆II_My Calendar II_Leetcode #731

更新於 發佈於 閱讀時間約 1 分鐘

題目敘述 My Calendar II


給定一個行事曆的class定義和行程安排的介面interface。


請完成下列function

1.建構子MyCalendarTwo() 初始化MyCalendarTwo物件


2.boolean book(int start, int end)

在行事曆加入一項新行程,起始時間為start, 結束時間為end。

該行程占用的時間是[start, end) 包含起點start, 不包含終點end。


如果新行程不會和舊行程重疊 或者 新行程只和舊行程重疊一次
新行程加入行事曆,並且回傳true


如果新行程會和已知的兩個舊行程有重疊,則拒絕新行程,並且回傳false

也就是說,每個時間點最多允許預約booking兩個行程,拒絕第三個行程。


測試範例

Example 1:

Input
["MyCalendarTwo", "book", "book", "book", "book", "book", "book"]
[[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
Output
[null, true, true, true, false, true, true]

Explanation
MyCalendarTwo myCalendarTwo = new MyCalendarTwo();
myCalendarTwo.book(10, 20); // 可以,沒有和任何行程重疊。
myCalendarTwo.book(50, 60); // 可以,沒有和任何行程重疊。
myCalendarTwo.book(10, 40); // 可以,從這次排程之後,[10, 20) 被預定兩個行程。
myCalendarTwo.book(5, 15); // 拒絕,因為[10, 15) 已經有兩個行程了。
myCalendarTwo.book(5, 10); // 可以,沒有和任何行程重疊。
myCalendarTwo.book(25, 55); // 可以,從這次排程之後,[25, 40) 和 [50,55) 被預定兩個行程。


範例輔助說明

raw-image

示意圖 重複的檢測

raw-image

演算法 每個時間點最多允許兩個行程,拒絕第三個行程。


每個行程進來先檢查是否已經有兩個行程double_bookings和當下的行程有重疊?
如果有,直接拒絕第三個行程,返回False。


接著,檢查和已知行程single_bookings是否有重疊?

如果有,就把重疊兩次的時間區域加入double_bookings


最後,把新行程加入single_bookings,並且返回True,代表成功排入這個新行程。


程式碼 每個時間點最多允許兩個行程,拒絕第三個行程。

class MyCalendarTwo:
def __init__(self):

# 紀錄被一個行程佔據的時間區間
self.single_bookings = []

# 紀錄被兩個行程佔據的時間區間
self.double_bookings = []

def book(self, start: int, end: int) -> bool:
# 檢查新行程是否有和兩個已知的行程重疊?
# 如果有,直接拒絕新行程,返回 False。
for double_start, double_end in self.double_bookings:
if start < double_end and end > double_start:
return False

# 檢查新行程是否有和一個已知的行程重疊?
# 如果有,把重疊的時間區域記錄下來,加入double booking。
for single_start, single_end in self.single_bookings:
if start < single_end and end > single_start:
self.double_bookings.append((max(start, single_start), min(end, single_end)))

# 接受當下這個新行程,返回True
self.single_bookings.append((start, end))
return True

複雜度分析

時間複雜度: O(n^2)

總共有n個行程,每個行程需要花費O(n)時間和已知行程做檢查。
總共耗時O(n^2)

空間複雜度: O(n)

需要額外建立兩張表格,single_bookingsdouble_bookings
所需空間皆為O(n)


關鍵知識點

考的是區間如何表達,以及新增區間檢查區間有無重疊的演算法。

強烈建議讀著一併複習相關系列題,鞏固知識點。

📆行程安排 我的行事曆I_My Calendar I_Leetcode #729


Reference

[1] My Calendar II - LeetCode

留言
avatar-img
留言分享你的想法!
Vanessa  Li-avatar-img
2024/09/29
原來還可以這樣啊~
小松鼠-avatar-img
發文者
2024/09/29
Vanessa Li
小松鼠-avatar-img
發文者
2024/09/29
林燃(創作小說家)
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/21
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
Thumbnail
2024/09/21
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
題目敘述 題目會給定一個輸入陣列intervals,陣列元素都是一組pair, intervals[i] = [starti, endi],分別代表區間的起點,和區間的終點。 請問我們最少要刪除幾個區間,才能讓剩下的區間彼此都不重疊? 題目的原文敘述 測試範例 Example 1:
Thumbnail
題目敘述 題目會給定一個輸入陣列intervals,陣列元素都是一組pair, intervals[i] = [starti, endi],分別代表區間的起點,和區間的終點。 請問我們最少要刪除幾個區間,才能讓剩下的區間彼此都不重疊? 題目的原文敘述 測試範例 Example 1:
Thumbnail
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
Thumbnail
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News