题目地址:
https://leetcode.com/problems/seat-reservation-manager/
要求设计一个座位预定系统,实现下面功能:
1、初始化
n
n
n个位置,编号为
1
∼
n
1\sim n
1∼n;
2、预定一个座位,要求该座位是所有未预定的座位里编号最小的那个;
3、释放一个已经预定的座位(输入是被释放的座位编号)。
思路是用最小堆,该堆存 1 ∼ n 1\sim n 1∼n这些座位。初始化的时候先将 n n n个数入堆,预定的时候将堆顶出堆并返回,释放时则将要释放的座位编号入堆。代码如下:
import java.util.PriorityQueue;
public class SeatManager {
private PriorityQueue<Integer> minHeap;
public SeatManager(int n) {
minHeap = new PriorityQueue<>();
while (n-- > 0) {
minHeap.offer(n + 1);
}
}
public int reserve() {
return minHeap.poll();
}
public void unreserve(int seatNumber) {
minHeap.offer(seatNumber);
}
}
初始化时间复杂度 O ( n log n ) O(n\log n) O(nlogn),其余操作时间 O ( log n ) O(\log n) O(logn),空间 O ( n ) O(n) O(n)。