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

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
20240729 生活的變動使我有些暴躁,因此決定開啟一個為期一年的寫點東東計畫,以此提醒自己記得感恩記得思考,記得好好解決問題,記得勇敢,記得努力也記得休息。 如果你願意陪我一起進行,我會非常非常高興及感謝🙏🏻
Thumbnail
百日百字計畫 #35 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #27 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #18 一百天一百字的紀錄,練習覺察的百日紀錄。
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
可能包含敏感內容
選擇你腦海中的數字,本週將會迎來甚麼樣的訊息和自我提醒呢?
Thumbnail
20240729 生活的變動使我有些暴躁,因此決定開啟一個為期一年的寫點東東計畫,以此提醒自己記得感恩記得思考,記得好好解決問題,記得勇敢,記得努力也記得休息。 如果你願意陪我一起進行,我會非常非常高興及感謝🙏🏻
Thumbnail
百日百字計畫 #35 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #27 一百天一百字的紀錄,練習覺察的百日紀錄。
Thumbnail
百日百字計畫 #18 一百天一百字的紀錄,練習覺察的百日紀錄。
#與自己交換日記 #Week05留白 #Day3 Q.你是否有過把行事曆塞滿的時候呢? 什麼樣的行程安排會令你感到最自在? 例如:一週至少一天在家休息。 ✍️很少將自己的行事曆排滿。 一週出門活動大概三天or四天,盡量下午就回到家。 現在也盡量將活動安排在白天,晚上盡量不出門。 寫於20240