ETH官方钱包

前往
大廳
主題

LeetCode - 1845. Seat Reservation Manager 解題心得

Not In My Back Yard | 2021-07-02 00:00:03 | 巴幣 0 | 人氣 344

題目連結:


題目意譯:
請設計一個系統(tǒng),其可以管理著編號為 1 到 n 的 n 個座位之預約狀態(tài)。

實作類別 SeatManager:

SeatManager(int n) 初始畫一個 SeatManager 物件,其將管理著編號 1 到 n 的 n 個座位。所有座位一開始皆是空閒的。
int reserve() 抓取最小編號的未預約之座位,將其保留為預約,並回傳其編號。
void unreserve(int seatNumber) 解除給定編號 seatNumber 的座位之預約狀態(tài)。

限制:
1 ≦ n ≦ 10 ^ 5
1 ≦ seatNumber ≦ n
對於每次 reserve 之呼叫,保證至少會有一個未預約之座位。
對於每次 unreserve 之呼叫,保證 seatNumber 為已預約之座位。
最多有 10 ^ 5 次呼叫是 reserve 和 unreserve 。



範例測資:
輸入
["SeatManager", "reserve", "reserve", "unreserve", "reserve", "reserve", "reserve", "reserve", "unreserve"]
[[5], [], [], [2], [], [], [], [], [5]]
輸出
[null, 1, 2, null, 2, 3, 4, 5, null]
解釋
SeatManager seatManager = new SeatManager(5); // 初始化一個有著 5 個座位的 SeatManager。
seatManager.reserve();    // 所有座位皆可被預約,所以回傳最低的座位編號,其為 1 。
seatManager.reserve();    // 可預約座位為 [2,3,4,5] ,所以回傳其中最低的座位編號,其為 2 。
seatManager.unreserve(2); // 將編號 2 的座位解除預約,所以現(xiàn)在可預約座位為 [2,3,4,5] 。
seatManager.reserve();    // 可預約座位為 [2,3,4,5] ,所以回傳其中最低的座位編號,其為 2 。
seatManager.reserve();    // 可預約座位為 [3,4,5] ,所以回傳其中最低的座位編號,其為 3 。
seatManager.reserve();    // 可預約座位為 [4,5] ,所以回傳其中最低的座位編號,其為 4 。
seatManager.reserve();    // 唯一可預約之作為為編號 5 之座位,所以回傳 5 。
seatManager.unreserve(5); // 將編號 5 的座位解除預約,所以可預約座位為 [5] 。


解題思維:
因為每次都要抓未預約的座位中編號最小的,因此我們可以使用一個優(yōu)先佇列(Priority Queue,其可由堆積(Heap)實作,參見這題)P 來儲存目前所有未被預約的座位編號。其中 P.top() 為所有編號裡面最小的(C++ 預設會是存最大值,所以需要設定一下,如 priority_queue <int, vector<int>, greater<int>> 等)。

因此一開始執(zhí)行初始化 SeatManager(int n) 時,我們將數(shù)字 1 ~ n 全部放入 P 中。

接著對於每次的 reserve() 之呼叫,我們回傳 P.top()(記得要執(zhí)行 P.pop() ,因為此時 P.top() 不應繼續(xù)存在於優(yōu)先佇列中)。

以及每次的 unreserve(int seatNumber) 之呼叫,我們便將 seatNumber 重新放入 P 中以示該編號又重新可被預約。

以上便可以完成題目所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應

相關創(chuàng)作

更多創(chuàng)作