- Seat Reservation Manager
Medium
Design a system that manages the reservation state of n seats that are numbered from 1 to n.
Implement the SeatManager class:
SeatManager(int n) Initializes a SeatManager object that will manage n seats numbered from 1 to n. All seats are initially available.
int reserve() Fetches the smallest-numbered unreserved seat, reserves it, and returns its number.
void unreserve(int seatNumber) Unreserves the seat with the given 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 105 calls in total will be made to reserve and unreserve.
解法1: 用set。
class SeatManager {
public:
SeatManager(int n) {
for (int i = 1; i <= n; i++) {
unreserved.insert(i);
}
}
int reserve() {
int num = *unreserved.begin();
unreserved.erase(num);
return num;
}
void unreserve(int seatNumber) {
unreserved.insert(seatNumber);
}
private:
set<int> unreserved;
};
/**
* Your SeatManager object will be instantiated and called as such:
* SeatManager* obj = new SeatManager(n);
* int param_1 = obj->reserve();
* obj->unreserve(seatNumber);
*/
实际上用priority_queue更好。
class SeatManager {
public:
SeatManager(int n) {
for (int i = 1; i <= n; i++) {
minHeap.push(i);
}
}
int reserve() {
int num = minHeap.top();
minHeap.pop();
return num;
}
void unreserve(int seatNumber) {
minHeap.push(seatNumber);
}
private:
priority_queue<int, vector<int>, greater<int>> minHeap;
};
/**
* Your SeatManager object will be instantiated and called as such:
* SeatManager* obj = new SeatManager(n);
* int param_1 = obj->reserve();
* obj->unreserve(seatNumber);
*/
本文围绕座位预订管理系统展开,设计一个管理编号从1到n的n个座位预订状态的系统。介绍了SeatManager类的初始化、预订和取消预订方法,并给出示例。还提及了约束条件,最后指出解法用set,实际上用priority_queue更好。

被折叠的 条评论
为什么被折叠?



