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);
 */
相关推荐
Scabbards_3 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
ValhallaCoder6 小时前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
青 春 记 忆10 小时前
LeetCode 104. 二叉树的最大深度|Python 解法详解
python·算法·leetcode
evans在进步13 小时前
LeetCode 198:打家劫舍——Java 动态规划详解
java·leetcode·动态规划
Nil20814 小时前
leetcode 234回文链表
算法·leetcode·链表
ZC跨境爬虫14 小时前
LeetCode 119. 杨辉三角 II(原地更新优化详解 + Java Python 实现)
java·python·leetcode
吃着火锅x唱着歌14 小时前
LeetCode 3597.分割字符串
算法·leetcode·职场和发展
Nil2081 天前
leetcode 160相交链表
算法·leetcode·链表
ZC跨境爬虫1 天前
LeetCode 108. 将有序数组转换为二叉搜索树(递归构建详解 + Java Python 实现)
java·python·leetcode
Tisfy1 天前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口