【Leetcode】855. 考场就座

embedded/2024/12/26 12:46:18/

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
在考场里,有 n n n 个座位排成一行,编号为 0 0 0 n − 1 n - 1 n1

当学生进入考场后,他必须坐在离最近的人最远的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 0 0 号座位上。)

设计一个模拟所述考场的类。

实现 E x a m R o o m ExamRoom ExamRoom 类:

E x a m R o o m ( i n t n ) ExamRoom(int\,n) ExamRoom(intn) 用座位的数量 n 初始化考场对象。
i n t s e a t ( ) int\,seat() intseat() 返回下一个学生将会入座的座位编号。
v o i d l e a v e ( i n t p ) void\,leave(int\,p) voidleave(intp) 指定坐在座位 p p p 的学生将离开教室。保证座位 p p p 上会有一位学生。
示例 1:

输入:
[“ExamRoom”, “seat”, “seat”, “seat”, “seat”, “leave”, “seat”]
[[10], [], [], [], [], [4], []]
输出: [null, 0, 9, 4, 2, null, 5]
解释:
ExamRoom examRoom = new ExamRoom(10); examRoom.seat(); // 返回 0,房间里没有人,学生坐在 0 号座位。
examRoom.seat(); // 返回 9,学生最后坐在 9 号座位。
examRoom.seat(); // 返回 4,学生最后坐在 4 号座位。 examRoom.seat(); // 返回 2,学生最后坐在2 号座位。
examRoom.leave(4);
examRoom.seat(); // 返回 5,学生最后坐在 5 号座位。

提示:

  1. 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1n109
  2. 保证有学生正坐在座位 p p p 上。
  3. s e a t seat seat l e a v e leave leave 最多被调用 1 0 4 10^4 104 次。

思路

这个问题可以通过模拟的方式来解决。我们需要维护一个座位集合,每次调用 seat() 时,找到第一个满足条件的座位分配给学生,并在调用 leave(int p) 时,释放该座位。

代码

class ExamRoom {
public:set<int>st;int n;ExamRoom(int N) {n = N;}int seat() {if (st.empty()) {st.insert(0); return 0;}int pre = *st.begin(), idx = 0, mx = pre;for (auto u : st) {if ((u - pre) / 2 > mx) {idx = (u + pre) / 2;mx = (u - pre) / 2;}pre = u; }if (n - 1 - pre > mx) {idx = n - 1;}st.insert(idx);return idx;}void leave(int p) {st.erase(p);}
};

复杂度分析

时间复杂度

O ( N ) O(N) O(N),其中 N N N 是座位集合 s t st st 的大小。

空间复杂度

O ( N ) O(N) O(N),需要存储所有已占用的座位编号。

结果

在这里插入图片描述

总结

本题是一个模拟题,关键在于理解如何模拟座位的分配和释放过程。通过维护一个座位集合,我们可以有效地找到满足条件的座位,并在学生离开时释放座位。这种方法简单且高效,适用于需要管理有限资源的场景。


http://www.ppmy.cn/embedded/148893.html

相关文章

C语言-基因序列转换独热码(one-hot code)

1.题目要求 (语言: C)在生物信息学家处理基因序列时&#xff0c;经常需要将基因序列转化为独热码&#xff0c;在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特&#xff0c;而且只有一个比特为1&#xff0c;其他全为0的一种码制。 如基因序列有四种状态&…

云手机服务器如何做到群控多台手机的?

亚矩阵云手机服务器解决方案是基于ARM集群芯片和虚拟化技术的一站式解决方案&#xff0c;具有高性能&#xff0c;高集成度的特点&#xff1b;支持一键操控、应用多开、真机检测等功能&#xff1b;广泛适用于舆情监测、海外推广、APP检测、政务云手机等场景。 亚矩阵云手机服务器…

Java学习笔记(16)--面向对象编程

学习资料来自接口 - Java教程 - 廖雪峰的官方网站 面向对象基础 目录 面向对象基础 接口 定义 术语 接口继承 继承关系 default方法 default方法和抽象类的普通方法的区别&#xff1a; 练习 小结 接口 定义 如果一个抽象类没有字段&#xff0c;所有方法都是抽象方…

华三M-LAG场景下,部分MAC内的流量泛洪导致端口流量打满

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 问题描述 华三M-LAG场景下&#xff0c;部分MAC内的流量泛洪导致端口流量打满 解决方案 在交换机设备上创建1个无用的聚合口&#xff0c;该聚合口加入到mlag组&#xff0c;并将异常泛洪的MAC加入到该接口即可解决。&…

拆解Java中——“ 注解 ”和“ 注释 ” 的一切区别Ⅱ

前言&#xff1a; 上一篇&#xff0c;我们讲到了&#xff1a; ①注解的引入&#xff08;简单概述&#xff09;&#xff1a;在jdk5.0的时候 ②注解与注释的区别&#xff1a; 注释 是为了帮助人类阅读代码&#xff0c;不会对程序的执行产生任何影响。注解 是为了给编译器或运行…

[react]5、React脚手架

1、前端脚手架 1、Vue的脚手架&#xff1a;vue-cli 2、Angular的脚手架&#xff1a;angular-cli 3、React的脚手架&#xff1a;create-react-app 目前这些脚手架都是使用node编写的&#xff0c;并且都是基于webpack的&#xff0c;需要在电脑上安装node环境 脚手架的作用是帮助我…

微信小程序性能优化

性能优化是任何应用开发中的重要组成部分&#xff0c;尤其是在移动环境中。对于微信小程序而言&#xff0c;随着用户量的增加和应用功能的丰富&#xff0c;性能优化显得尤为关键。良好的性能不仅提升用户体验&#xff0c;还能增加用户留存率和应用的使用频率。我们将探讨如何在…

12寸半导体厂等保安全的设计思路

等级保护(等保)二级和三级的主要区别在于安全要求的严格程度、所需部署的安全措施和设备、以及对安全事件响应和处理的能力。以下是等保二级和三级之间的一些关键区别: 一、 安全要求严格程度: - 等保二级:适用于需要较高安全保护的信息系统,要求能够防范轻微的恶意攻击…