題目描述: 有一排 n 個座位(編號 0 到 n-1)。當學生進入考場時,要選擇離最近的人最遠的座位坐下。如果有多個座位距離相同,選編號最小的。實作 seat() 和 leave(p) 兩個操作。
解題思路:
時間複雜度:seat() 為 O(k),其中 k 為當前已佔座位數;leave() 為 O(log k)
空間複雜度:O(k) — 存儲已佔座位的有序集合
1. Maintain a sorted set of occupied seats
2. seat():
a. If set is empty, sit at seat 0
b. Compute distance from seat 0 to first occupied seat (head gap)
c. For each pair of adjacent occupied seats (prev, cur):
- Compute mid-gap distance = (cur - prev) / 2
- Track maximum distance and corresponding seat
d. Compute distance from last occupied seat to n-1 (tail gap)
e. Insert and return the seat with maximum distance (smallest index on tie)
3. leave(p): remove p from the set最大堆(Priority Queue)方法:將所有空隙 (start, end) 放入最大堆,按「距離, -起始位置」排序。seat() 從堆頂取出最大空隙,分裂成兩個子空隙放回堆。leave() 需要合併相鄰空隙(使用延遲刪除)。seat() 和 leave() 均為 O(log n),但實作較複雜。
暴力模擬:用布林陣列標記每個座位狀態。seat() 時遍歷所有空座位計算最小距離。時間 O(n) per seat(),適合 n 很小的情況。