📆行程安排 我的行事曆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

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
884. Uncommon Words from Two Sentences 給定兩個字串s1 和 s2,請找出uncommon words,以陣列的形式返回答案。 uncommon word的定義: 某個單字只在s1出現一次,沒有出現在s2;或者 某個單字只在s2出現一次,沒有出現在s1。
539. Minimum Time Difference 給定一個輸入陣列timePoints,每個陣列元素都是一個24小時制的時間。 請問最小的時間差距是多少? 註: 請以分鐘為單位回答。
1371. Find the Longest Substring Containing Vowels in Even Counts 給定一個字串s,請找出母音字母出現皆為偶數次的最長子字串的長度。 例如"paaoooq",母音字母出現皆為偶數次的最長子字串paaoo,長度為5。
2419. Longest Subarray With Maximum Bitwise AND 給定一個輸入陣列nums,請找出擁有最大bitwise AND值的子陣列長度是多少?
Count the Number of Consistent Strings 給定一個字庫allowed,和一個字串陣列words,請計算有幾個word是一致的? 一致的定義是: word內所有的英文字母都可以在allowed內找到。
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
884. Uncommon Words from Two Sentences 給定兩個字串s1 和 s2,請找出uncommon words,以陣列的形式返回答案。 uncommon word的定義: 某個單字只在s1出現一次,沒有出現在s2;或者 某個單字只在s2出現一次,沒有出現在s1。
539. Minimum Time Difference 給定一個輸入陣列timePoints,每個陣列元素都是一個24小時制的時間。 請問最小的時間差距是多少? 註: 請以分鐘為單位回答。
1371. Find the Longest Substring Containing Vowels in Even Counts 給定一個字串s,請找出母音字母出現皆為偶數次的最長子字串的長度。 例如"paaoooq",母音字母出現皆為偶數次的最長子字串paaoo,長度為5。
2419. Longest Subarray With Maximum Bitwise AND 給定一個輸入陣列nums,請找出擁有最大bitwise AND值的子陣列長度是多少?
Count the Number of Consistent Strings 給定一個字庫allowed,和一個字串陣列words,請計算有幾個word是一致的? 一致的定義是: word內所有的英文字母都可以在allowed內找到。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
  接續上一篇文章,換言之,不會因為放假不能睡晚而影響到心情,就算六日都早起,週一也可以保持平靜的心情上班。而在新的一年裡,無論是以一月一日或農曆春節過後為起始日,先將計畫安排好,心裡也會有個底,知道這一年要完成什麼計畫。對於工作的內容,可以用兩個角度來思考:         第一,如果是
Thumbnail
製作月曆或是排班表,常常會將週末的儲存格填上不同的顏色,來區分平日與假日。 但如果你還在手動慢慢調整,那你就太落伍囉~~ 這集教你3種常見標示的方法: 週末(六日)日期標示 週末(六日)含國定假日標示 週末(六日)並考慮國定假日與補班標示 📌週末(六日)標示 選取資
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240
Thumbnail
這週運勢很不錯👍 如果星期一、二、三有什麼娛樂活動可以安排
Thumbnail
Welcome 2024! 給予自己一年的行動清單,讓自己比2023年要更好、更成長
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
  接續上一篇文章,換言之,不會因為放假不能睡晚而影響到心情,就算六日都早起,週一也可以保持平靜的心情上班。而在新的一年裡,無論是以一月一日或農曆春節過後為起始日,先將計畫安排好,心裡也會有個底,知道這一年要完成什麼計畫。對於工作的內容,可以用兩個角度來思考:         第一,如果是
Thumbnail
製作月曆或是排班表,常常會將週末的儲存格填上不同的顏色,來區分平日與假日。 但如果你還在手動慢慢調整,那你就太落伍囉~~ 這集教你3種常見標示的方法: 週末(六日)日期標示 週末(六日)含國定假日標示 週末(六日)並考慮國定假日與補班標示 📌週末(六日)標示 選取資
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240
Thumbnail
這週運勢很不錯👍 如果星期一、二、三有什麼娛樂活動可以安排
Thumbnail
Welcome 2024! 給予自己一年的行動清單,讓自己比2023年要更好、更成長