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

閱讀時間約 1 分鐘

題目敘述 729. My Calendar I



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

請完成下列function

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


2.boolean book(int start, int end)
在行事曆加入一項新行程,起始時間為start, 結束時間為end。
該行程占用的時間是[start, end) 包含起點start, 不包含終點end

如果新行程不會和舊行程重疊,把新行程加入行事曆,並且回傳true
如果新行程會和舊行程重疊,則拒絕新行程,並且回傳false



測試範例

Example 1:

Input
["MyCalendar", "book", "book", "book"]
[[], [10, 20], [15, 25], [20, 30]]
Output
[null, true, false, true]

Explanation
MyCalendar myCalendar = new MyCalendar();
myCalendar.book(10, 20); // 可以 返回True
myCalendar.book(15, 25); // [15, 25) 已經和前一個行程[10, 20)重疊,返回False
myCalendar.book(20, 30); // 可以 [20, 30) 和 [10, 20) 沒有重疊,可以加入行事曆。返回True

約束條件

Constraints:

  • 0 <= start < end <= 10^9

0 <= 起點時間 < 終點時間<= 十億

  • At most 1000 calls will be made to book.

動態測試時,最多有1000次book() function 呼叫。


示意圖 二元區間搜索樹


如果還不熟悉二元搜索樹BST,請參考這篇教學文章。

🏝用Python來實現 Binary Search Tree 二元搜尋樹


raw-image

演算法 二元區間搜索樹


我們可以把行事曆視為一顆二元區間搜索樹

每個行程視為一顆節點,裡面包含[start, end)資訊。


任何比較晚的行程插入時,都放在右子樹,並且返回True。

任何比較早的行程插入時,都放在左子樹,並且返回True。

如果新行程和舊有的行程有重疊,則return False,代表行程有重疊,拒絕新行程


程式碼 二元區間搜索樹

class TreeNode():
def __init__(self, start, end):
self.start = start
self.end = end
self.left = None
self.right = None

class MyCalendar:

def __init__(self):
self.root = None

def book(self, start: int, end: int) -> bool:
if not self.root:
self.root = TreeNode(start, end)
return True
else:
return self.insert(start, end, self.root)


def insert(self, start, end, node):
if start >= node.end:
if node.right:
return self.insert(start, end, node.right)
else:
node.right = TreeNode(start, end)
return True
elif end <= node.start:
if node.left:
return self.insert(start, end, node.left)
else:
node.left = TreeNode(start, end)
return True
else:
return False

複雜度分析

時間複雜度: O( n log n)

總共n個行程,每個行程插入二元區間搜索樹時耗費O(log n)時間。
總共需時O( n log n)

空間複雜度: O(n)

總共n個行程,每個行程視為一顆節點Node,放入二元區間搜索樹。

二元區間搜索樹最多會有O(n)顆節點。


Reference

[1] My Calendar I - LeetCode

84會員
422內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
 Binary Tree Inorder Traversal 題目給定一個二元樹的根結點。 請輸出中序拜訪(In-order traversal)的拜訪序列。 中序拜訪的定義: 1.拜訪左子樹。 2.拜訪目前的節點。 3.拜訪右子樹。
Most Stones Removed with Same Row or Column 給定一個2D平面,好幾顆石頭散布在不同的點座標。 輸入陣列代表每顆石頭所在的(x, y)座標。 如果某顆石頭的x座標或者y座標相同的軸線上,還有其他石頭, 則原本那顆石頭可以移除。 請問做多可已移除幾顆石頭?
給定兩個相同大小的二維陣列grid1, grid2。 格子點為0的地方代表海洋,格子點為1的地方代表陸地。 島嶼的定義是4連通(上、下、左、右)相鄰在一起的陸地。 如果有某個區域在grid2 是島嶼而且在grid1也是陸地, 那麼這些區域就稱為「子島嶼」。 請問grid2裡有多少座子島嶼?
題目敘述 N-ary Tree Postorder Traversal 題目給定一個n-ary(每個節點最多n個子樹)的樹根。 請返回後序拜訪這棵樹的軌跡。 推廣後的後序拜訪的定義: 1.從左到右依序拜訪所有子樹。 2.拜訪目前的節點。
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
 Binary Tree Inorder Traversal 題目給定一個二元樹的根結點。 請輸出中序拜訪(In-order traversal)的拜訪序列。 中序拜訪的定義: 1.拜訪左子樹。 2.拜訪目前的節點。 3.拜訪右子樹。
Most Stones Removed with Same Row or Column 給定一個2D平面,好幾顆石頭散布在不同的點座標。 輸入陣列代表每顆石頭所在的(x, y)座標。 如果某顆石頭的x座標或者y座標相同的軸線上,還有其他石頭, 則原本那顆石頭可以移除。 請問做多可已移除幾顆石頭?
給定兩個相同大小的二維陣列grid1, grid2。 格子點為0的地方代表海洋,格子點為1的地方代表陸地。 島嶼的定義是4連通(上、下、左、右)相鄰在一起的陸地。 如果有某個區域在grid2 是島嶼而且在grid1也是陸地, 那麼這些區域就稱為「子島嶼」。 請問grid2裡有多少座子島嶼?
題目敘述 N-ary Tree Postorder Traversal 題目給定一個n-ary(每個節點最多n個子樹)的樹根。 請返回後序拜訪這棵樹的軌跡。 推廣後的後序拜訪的定義: 1.從左到右依序拜訪所有子樹。 2.拜訪目前的節點。
你可能也想看
Google News 追蹤
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
20240729 生活的變動使我有些暴躁,因此決定開啟一個為期一年的寫點東東計畫,以此提醒自己記得感恩記得思考,記得好好解決問題,記得勇敢,記得努力也記得休息。 如果你願意陪我一起進行,我會非常非常高興及感謝🙏🏻
Thumbnail
百日百字計畫 #35 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #27 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #18 一百天一百字的紀錄,練習覺察的百日紀錄。
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
20240729 生活的變動使我有些暴躁,因此決定開啟一個為期一年的寫點東東計畫,以此提醒自己記得感恩記得思考,記得好好解決問題,記得勇敢,記得努力也記得休息。 如果你願意陪我一起進行,我會非常非常高興及感謝🙏🏻
Thumbnail
百日百字計畫 #35 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #27 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #18 一百天一百字的紀錄,練習覺察的百日紀錄。
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240