實作餐廳訂位報號系統 Seat Reservation Manager Leetcode #1845

更新於 發佈於 閱讀時間約 7 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會定義一組類別和介面,要求我們實做餐廳訂位報號系統。

SeatManager(int n) : 初始化餐廳最多有n個座位,n 最少是1

int reserve() : 要求返回最小的可讓客人入座的空座位編號。

void unreserve(int seatNumber) : 取消訂位,這個座位歸還給訂位系統。


測試範例

Example 1:

Input
["SeatManager", "reserve", "reserve", "unreserve", "reserve", "reserve", "reserve", "reserve", "unreserve"]
[[5], [], [], [2], [], [], [], [], [5]]
Output
[null, 1, 2, null, 2, 3, 4, 5, null]

Explanation
SeatManager seatManager = new SeatManager(5); // Initializes a SeatManager with 5 seats.
seatManager.reserve(); // All seats are available, so return the lowest numbered seat, which is 1.
seatManager.reserve(); // The available seats are [2,3,4,5], so return the lowest of them, which is 2.
seatManager.unreserve(2); // Unreserve seat 2, so now the available seats are [2,3,4,5].
seatManager.reserve(); // The available seats are [2,3,4,5], so return the lowest of them, which is 2.
seatManager.reserve(); // The available seats are [3,4,5], so return the lowest of them, which is 3.
seatManager.reserve(); // The available seats are [4,5], so return the lowest of them, which is 4.
seatManager.reserve(); // The only available seat is seat 5, so return 5.
seatManager.unreserve(5); // Unreserve seat 5, so now the available seats are [5].

約束條件

Constraints:

  • 1 <= n <= 105
  • 1 <= seatNumber <= n
  • For each call to reserve, it is guaranteed that there will be at least one unreserved seat.
  • For each call to unreserve, it is guaranteed that seatNumber will be reserved.
  • At most 10^5 calls in total will be made to reserve and unreserve.

演算法

題目已經給定座位號碼都是1~n的整數。

而且,剛好要求返回的帶位號碼是要求從當下最小的空位開始帶位。

很直覺的,可以想到用min Heap 最小堆積 搭配 當前最後一筆帶位號碼last_seat_num來實作整個餐廳訂位系統。


報空位帶位時,假如min Heap非空,代表有之前退還回來的空位,則從min Heap取出最小的空位號碼。

假如min Heap為空,代表沒有之前退還回來的空位。直接從1,2,3...的順序,從小到大回報空位即可,並且,把空位記錄在last_seat_num。


取消訂位時,假如取消的座位和last_seat_num相同,代表是取消剛剛近來的那筆最新的定位,這時侯,只要在last_seat_num減一,做取消訂位即可。

假如取消的座位和last_seat_num不同,代表是取消的很久以前的訂位,這時候就把取消的座位號碼推入min Heap 被退回空位的池子裡(本身用最小堆積來實作,保證之後取到的都是從小的號碼開始取)。


程式碼

class SeatManager:

 def __init__(self, n: int):

  # Build a minheap
  self.min_heap = []
  self.last_seat_num = 0

 def reserve(self) -> int:
  # pop out smallest number
  if self.min_heap:
   cur = heapq.heappop(self.min_heap)
   return cur
  
  else:
   self.last_seat_num += 1
   return self.last_seat_num
  

 def unreserve(self, seatNumber: int) -> None:
  if self.last_seat_num == seatNumber:
   self.last_seat_num -= 1
   
  else:
   # push unreserved number back to minheap
   heapq.heappush(self.min_heap, seatNumber)
  return


# Your SeatManager object will be instantiated and called as such:
# obj = SeatManager(n)
# param_1 = obj.reserve()
# obj.unreserve(seatNumber)​

複雜度分析

時間複雜度:

init(): O(1)

reserve(): O( log n ) min heap 取出頂端的最小值,並且調整min heap。

unreseve(): O( log n ) min heap 推入被退回的空位,並且調整min heap。

空間複雜度: O(n)
當全部訂位訂滿之後,從一號開始連續退回空位時,min heap所佔用空間有可能到達最大座位號碼O(n)


關鍵知識點

從餐廳帶位總是從最小號碼開始帶位,聯想到使用min heap最小堆積來實作


Reference:

[1] Seat Reservation Manager - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
夢見我參加 Hank 公司辦的講座。我來到會場要找座位,明明看到很多空位,但走過去後才發現座位已經有人佔位了。 後來聽眾陸續進場,講座就要開始,我竟然連一個位子都沒有。我故意大聲嚷嚷:「我很早來耶!可是怎麼竟然連一個位子都沒有?」大家都在笑。 當下我記得有一個座右銘蠻適合我的狀況,就是說「你不要
Thumbnail
他初次來這一帶,有點緊張。 坐定後他打開攜帶的筆電,叫出偽裝用的表單做做樣子開始等待。 十二點五分,附近的上班族一湧而入購買午餐。 櫃檯前的人龍出乎意料得長。
2024/06/17 顯化小事《座無虛席的自助餐,我一到達立刻出現位置!》 晚上去自助餐,瞄了一下很多人,但我就是想吃自助餐。 當我停好機車,往自助餐店走去的時候,我就想著(我要顯化)「我到的時候就有位置,還多一個椅子可以放安全帽。」一個路程大約想了兩次。 然後我到達店門口透過玻璃,
Thumbnail
本文將探討辦公室管理系統如何有效處理交誼廳借用及管理事宜,包括建立線上預約系統、設定借用規則政策、自動化審批流程、提供使用指南和規範,以及數據分析報告。透過辦公室管理系統,企業能夠實現交誼廳借用的高效、透明和合規管理,提高員工滿意度和工作效率。
Thumbnail
體驗舒適用餐環境的關鍵在於座位佈局。我們精心設計,將空間最大化,提供各種座位類型,從單人到團體應有盡有。流暢的流動路線,視覺吸引力窗景,靈活座位設計,功能區域齊全。無論您獨自用餐或與親友聚餐,我們都能提供理想的用餐環境。
06/02/2017 無解的服務   辦理登機證時,有團員請我協助安排座位,其實團體機位是由航空公司,依英文姓名劃位,領隊並無法決定。 但旅客總認為領隊有辦法決定機上的位置,這點實在是很無奈。   也有團員希望領隊將登機證,重新整理再分配。 但這又會帶來新的問題,因為有的旅客他比較希望
目前開發目標-至少要完成用戶順利執行訂房行為 完成 1.用戶註冊與個人資料創建(O)。 2.添加新的房間訊息(O)。 3.瀏覽房間列表與詳細頁面(O),不過進階查詢還沒做。 4.顯示房間可用性(O),初步完成能透過條件(輸入住房日期、退房日期、特定酒店的特定房型)找出某一時間範圍內可ava
Thumbnail
同樣是餐飲業,客人消費的心理大不相同 每個人一定都有去餐廳點餐的經驗,有不少都改成線上點餐縮減前台服務人員,但最基礎的菜單版面都還是以推薦套餐-單點-特色料理-甜點飲品這種順序做排列組合,那如果在小吃攤看到這種菜單,會讓你想點餐還是缺乏興趣呢? 舉個例子,你去買鹹酥雞看到菜單上第一行寫著,套
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
夢見我參加 Hank 公司辦的講座。我來到會場要找座位,明明看到很多空位,但走過去後才發現座位已經有人佔位了。 後來聽眾陸續進場,講座就要開始,我竟然連一個位子都沒有。我故意大聲嚷嚷:「我很早來耶!可是怎麼竟然連一個位子都沒有?」大家都在笑。 當下我記得有一個座右銘蠻適合我的狀況,就是說「你不要
Thumbnail
他初次來這一帶,有點緊張。 坐定後他打開攜帶的筆電,叫出偽裝用的表單做做樣子開始等待。 十二點五分,附近的上班族一湧而入購買午餐。 櫃檯前的人龍出乎意料得長。
2024/06/17 顯化小事《座無虛席的自助餐,我一到達立刻出現位置!》 晚上去自助餐,瞄了一下很多人,但我就是想吃自助餐。 當我停好機車,往自助餐店走去的時候,我就想著(我要顯化)「我到的時候就有位置,還多一個椅子可以放安全帽。」一個路程大約想了兩次。 然後我到達店門口透過玻璃,
Thumbnail
本文將探討辦公室管理系統如何有效處理交誼廳借用及管理事宜,包括建立線上預約系統、設定借用規則政策、自動化審批流程、提供使用指南和規範,以及數據分析報告。透過辦公室管理系統,企業能夠實現交誼廳借用的高效、透明和合規管理,提高員工滿意度和工作效率。
Thumbnail
體驗舒適用餐環境的關鍵在於座位佈局。我們精心設計,將空間最大化,提供各種座位類型,從單人到團體應有盡有。流暢的流動路線,視覺吸引力窗景,靈活座位設計,功能區域齊全。無論您獨自用餐或與親友聚餐,我們都能提供理想的用餐環境。
06/02/2017 無解的服務   辦理登機證時,有團員請我協助安排座位,其實團體機位是由航空公司,依英文姓名劃位,領隊並無法決定。 但旅客總認為領隊有辦法決定機上的位置,這點實在是很無奈。   也有團員希望領隊將登機證,重新整理再分配。 但這又會帶來新的問題,因為有的旅客他比較希望
目前開發目標-至少要完成用戶順利執行訂房行為 完成 1.用戶註冊與個人資料創建(O)。 2.添加新的房間訊息(O)。 3.瀏覽房間列表與詳細頁面(O),不過進階查詢還沒做。 4.顯示房間可用性(O),初步完成能透過條件(輸入住房日期、退房日期、特定酒店的特定房型)找出某一時間範圍內可ava
Thumbnail
同樣是餐飲業,客人消費的心理大不相同 每個人一定都有去餐廳點餐的經驗,有不少都改成線上點餐縮減前台服務人員,但最基礎的菜單版面都還是以推薦套餐-單點-特色料理-甜點飲品這種順序做排列組合,那如果在小吃攤看到這種菜單,會讓你想點餐還是缺乏興趣呢? 舉個例子,你去買鹹酥雞看到菜單上第一行寫著,套