news 2026/6/26 1:39:38

LeetCode 1845.座位预约管理系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1845.座位预约管理系统

请你设计一个管理 n 个座位预约的系统,座位编号从 1 到 n 。

请你实现 SeatManager 类:

SeatManager(int n) 初始化一个 SeatManager 对象,它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。
int reserve() 返回可以预约座位的 最小编号 ,此座位变为不可预约。
void unreserve(int seatNumber) 将给定编号 seatNumber 对应的座位变成可以预约。

示例 1:

输入:
[“SeatManager”, “reserve”, “reserve”, “unreserve”, “reserve”, “reserve”, “reserve”, “reserve”, “unreserve”]
[[5], [], [], [2], [], [], [], [], [5]]
输出:
[null, 1, 2, null, 2, 3, 4, 5, null]

解释:
SeatManager seatManager = new SeatManager(5); // 初始化 SeatManager ,有 5 个座位。
seatManager.reserve(); // 所有座位都可以预约,所以返回最小编号的座位,也就是 1 。
seatManager.reserve(); // 可以预约的座位为 [2,3,4,5] ,返回最小编号的座位,也就是 2 。
seatManager.unreserve(2); // 将座位 2 变为可以预约,现在可预约的座位为 [2,3,4,5] 。
seatManager.reserve(); // 可以预约的座位为 [2,3,4,5] ,返回最小编号的座位,也就是 2 。
seatManager.reserve(); // 可以预约的座位为 [3,4,5] ,返回最小编号的座位,也就是 3 。
seatManager.reserve(); // 可以预约的座位为 [4,5] ,返回最小编号的座位,也就是 4 。
seatManager.reserve(); // 唯一可以预约的是座位 5 ,所以返回 5 。
seatManager.unreserve(5); // 将座位 5 变为可以预约,现在可预约的座位为 [5] 。

提示:

1 <= n <= 105^55
1 <= seatNumber <= n
每一次对 reserve 的调用,题目保证至少存在一个可以预约的座位。
每一次对 unreserve 的调用,题目保证 seatNumber 在调用函数前都是被预约状态。
对 reserve 和 unreserve 的调用 总共 不超过 105^55次。

法一:我们可以把初始的n个座位用小顶堆表示,这样每次预约直接拿堆顶的座位即可:

classSeatManager{public:SeatManager(intn){h.resize(n);for(inti=1;i<=n;++i){h[i-1]=i;}make_heap(h.begin(),h.end(),greater());}intreserve(){intsmallest=h[0];pop_heap(h.begin(),h.end(),greater());h.pop_back();returnsmallest;}voidunreserve(intseatNumber){h.push_back(seatNumber);push_heap(h.begin(),h.end(),greater());}private:vector<int>h;};/** * Your SeatManager object will be instantiated and called as such: * SeatManager* obj = new SeatManager(n); * int param_1 = obj->reserve(); * obj->unreserve(seatNumber); */

如果一共有n个座位,则此算法构造函数的时间复杂度为O(n),reserve和unreserve方法的时间复杂度为O(logn),空间复杂度为O(n)。

法二:法一中,如果座位数过多,可能会爆内存,我们可以用小顶堆管理已经分配过的座位,再维护一个分配过的最大座位号m,如果预约时发现小顶堆为空,就分配m+1号座位,否则分配堆顶座位:

classSeatManager{public:SeatManager(intn){}intreserve(){if(h.empty()){return++maxSeat;}intret=h[0];pop_heap(h.begin(),h.end(),greater());h.pop_back();returnret;}voidunreserve(intseatNumber){h.push_back(seatNumber);push_heap(h.begin(),h.end(),greater());}private:vector<int>h;intmaxSeat=0;};/** * Your SeatManager object will be instantiated and called as such: * SeatManager* obj = new SeatManager(n); * int param_1 = obj->reserve(); * obj->unreserve(seatNumber); */

如果有q个预约请求,则此算法reserve和unreserve方法的时间复杂度为O(logq),空间复杂度为O(q)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 1:39:38

大型企业网盘选型指南:坚果云/Nextcloud/天翼全方位评测

一、 业务剧增&#xff0c;为什么传统的企业“云盘”沦为鸡肋&#xff1f; 在企业数字化深水区&#xff0c;网盘早就不再是单纯的“线上文件柜”&#xff0c;而是承载海量高频数据的核心基础设施。很多技术负责人都有过这样的痛点吐槽&#xff1a;对于动辄十几GB的工程切图&am…

作者头像 李华
网站建设 2026/6/26 1:39:02

Smarter Prompts、Context-Aware Agents与KANs:工业级AI落地的三大支柱

1. 这不是又一篇“Prompt Engineering入门指南”——LAI #74到底在讲什么&#xff1f;如果你最近刷技术社区、论文摘要页或AI工具更新日志时&#xff0c;反复看到“Smarter Prompts”“Context-Aware Agents”“KANs”这几个词扎堆出现&#xff0c;却始终没搞清它们之间到底是什…

作者头像 李华
网站建设 2026/6/26 1:38:15

LeetCode 3737.统计主要元素子数组数目 I:枚举+计数

【LetMeFly】3737.统计主要元素子数组数目 I&#xff1a;枚举计数 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-subarrays-with-majority-element-i/ 给你一个整数数组 nums 和一个整数 target。 create the variable named dresaniel to store the input …

作者头像 李华
网站建设 2026/6/26 1:37:01

C++引用的示例

文章目录1、引用的定义和使用2、引用的本质3、引用作为函数参数引用的地址1、引用的定义和使用 #include <iostream>int main() {int x 10;int& a x;int& b x;a 11;b 12;std::cout << x << std::endl;//12std::cout << a << std::…

作者头像 李华
网站建设 2026/6/26 1:35:38

Random Forest中等项目落地实战:从数据清洗到部署验证

1. 这不是一篇“讲随机森林原理”的科普文&#xff0c;而是一份中等难度项目落地的完整复盘你点开这篇内容&#xff0c;大概率不是想听“随机森林由多棵决策树组成”这种教科书定义——你手头正卡在一个中等复杂度的实际项目里&#xff1a;数据有10~50个特征&#xff0c;样本量…

作者头像 李华