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);
 */
相关推荐
xsyaaaan2 小时前
leetcode-hot100-链表
leetcode·链表
逆境不可逃4 小时前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
leaves falling4 小时前
二分查找:迭代与递归实现全解析
数据结构·算法·leetcode
做怪小疯子4 小时前
Leetcode刷题——深度优先搜索(DFS)
算法·leetcode·深度优先
想吃火锅10056 小时前
【leetcode】105. 从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
圣保罗的大教堂6 小时前
leetcode 3567. 子矩阵的最小绝对差 中等
leetcode
老鼠只爱大米7 小时前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素
逆境不可逃7 小时前
LeetCode 热题 100 之 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
_日拱一卒8 小时前
LeetCode:移动零
算法·leetcode·职场和发展
_日拱一卒8 小时前
LeetCode:字母异位词分组
算法·leetcode·职场和发展