Leetcode1845. Seat Reservation Manager (堆的应用)

  1. 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。

cpp 复制代码
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更好。

cpp 复制代码
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);
 */
相关推荐
啦哈拉哈3 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
z2005093013 小时前
今日算法(回溯全排列)
c++·算法·leetcode
小欣加油14 小时前
leetcode3633 最早完成陆地和水上游乐设施的时间I
数据结构·c++·算法·leetcode
memcpy015 小时前
LeetCode 2657. 找到两个数组的前缀公共数组【集合,位运算】中等
算法·leetcode·职场和发展
踩坑记录15 小时前
leetcode 912 排序数组 堆排序
leetcode
8Qi815 小时前
LeetCode 236. 二叉树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·lca·后序遍历
兰令水15 小时前
leecodecode【二叉树排序+最近公共祖先】【2026.6.2打卡-java版本】
java·数据结构·算法·leetcode
人道领域15 小时前
【LeetCode刷题日记】77&&216.回溯算法剪枝优化在组合问题中的应用
java·算法·leetcode
圣保罗的大教堂15 小时前
leetcode 3633. 最早完成陆地和水上游乐设施的时间 I 简单
leetcode
菜菜的顾清寒15 小时前
力扣HOT100(51) 动态规划-单词拆分
算法·leetcode·动态规划