leetcode力扣刷题系列——【座位预约管理系统】

news2024/12/28 3:51:48

题目

请你设计一个管理 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
1 <= seatNumber <= n
每一次对 reserve 的调用,题目保证至少存在一个可以预约的座位。
每一次对 unreserve 的调用,题目保证 seatNumber 在调用函数前都是被预约状态。
对 reserve 和 unreserve 的调用 总共 不超过 105 次。

答案

我的方法
我的方法想的很简单,就是采用列表的形式,可以运行,运行的测试用例也是正确的,但是上传的话会出现超出时间的情况,虽然我运用了for循环,时间复杂度为O(n),但是我认为不是这个导致的,具体为什么,博主太菜了,博主也不知道,有知道的老哥可以分析一下。

class SeatManager(object):

    def __init__(self, n):
        """
        :type n: int
        """
        self.seat = [i for i in range(1,n+1)]
        

    def reserve(self):
        """
        :rtype: int
        """
        mins = min(self.seat)
        self.seat.remove(mins)
        return mins

    def unreserve(self, seatNumber):
        """
        :type seatNumber: int
        :rtype: None
        """
        self.seat.append(seatNumber)
        self.seat.sort()
# Your SeatManager object will be instantiated and called as such:
# obj = SeatManager(n)
# param_1 = obj.reserve()
# obj.unreserve(seatNumber)

官方的方法
官方的方法确实很好,但是有一个问题,在提交过后我发现他并不是最优解,他甚至是排在倒数的位置的,那么我们先看官方的方法吧,最后我们在看看其他大神最优的解法是如何做到的。
提示 1
考虑 reserve 与 unreserve 方法对应的需求。什么样的数据结构能够在较好的时间复杂度下支持这些操作?

思路与算法
根据 提示 1,假设我们使用数据结构 available 来维护所有可以预约的座位,我们需要分析 reserve 与 unreserve 的具体需求:

  • 对于 reserve 方法,我们需要弹出并返回 available 中的最小元素;
  • 对于 unreserve 方法,我们需要将 seatNumber 添加至 available 中。
  • 因此我们可以使用二叉堆实现的优先队列作为 available。对于一个最小堆,可以在 O(logn)的时间复杂度内完成单次「添加元素」与「弹出最小值」的操作。
  • 需要注意的是,Python 的二叉堆默认为最小堆,但 C++ 的二叉堆默认为最大堆。
from heapq import heappush, heappop

class SeatManager:

    def __init__(self, n: int):
        self.available = list(range(1, n + 1))

    def reserve(self) -> int:
        return heappop(self.available)

    def unreserve(self, seatNumber: int) -> None:
        heappush(self.available, seatNumber)

作者:力扣官方题解
链接:这是连接哦
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这边文章并没有写完,为什么没有写完呢?因为博主还在看官方给的解题思路,对于python本身博主就没有很好地学习,很多时候我要看很久才知道这个怎么做,不过我保证今天一定把这个完成!

————————————————————————————————————————————

我忙完回来了,兄弟们,官方给的代码我也看懂了。

首先说为什么我的代码会超时呢? 首先并不是我运用了for循环导致的时间复杂度为o(n),而是列表的插入和删除函数本身时间复杂度就是O(n)!!!!
然后为什么当数据足够多的时候官方的代码就能运行呢? 这是因为官方采用的是堆排序,而python中的heapq是最小堆。堆排序是完全二叉树,他的时间复杂度是O(logn)。
当我们假设n=1024时,前者的量级大约是 1024,而后者的时间复杂度,假设我们以2为底的话是他的量级为log2(1024)=10。是不是减少了很多的时间呢?
简单放个图让大家看一下什么是堆。
堆排序
最后! 最后一点! 为什么官方给的代码也排到了倒数的位置上呢?
说实话,我也不知道因为什么,我也尝试了其他人的代码,最后的结果都在这个位置,本来我以为是语言的问题,但是当我用C++提交了一次之后,发现他排名好像也不看这个,不同的语言排名是不一样的,但是我又不知道其他大哥怎么写的,所以如果有大佬能优化,让他更快的请发表出来,让我们也都学习一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单调队列应用介绍

单调队列应用介绍 定义应用场景实现模板具体示例滑动窗口最大值问题描述问题分析代码实现带限制的子序列和问题描述问题分析代码实现跳跃游戏问题描述问题分析代码实现定义 队列(Queue)是另一种操作受限的线性表,只允许元素从队列的一端进,另一端出,具有先进先出(FIFO)的特…

系统信息规划-系统架构师(七十四)

1前驱图 解析&#xff1a; 当S1执行完&#xff0c;C1S2并行执行&#xff0c;C1和S2执行完&#xff0c;P1,C2,S3并行执行&#xff0c;同理&#xff0c;P2C3并行执行。 直接制约则表示C1和P1受S1制约。 间接则代表S2和S3受S1制约。 2系统移植也是系统构建的一种实现方…

学习记录:js算法(五十一):统计二叉树中好节点的数目

文章目录 统计二叉树中好节点的数目网上思路 总结 统计二叉树中好节点的数目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 图一&#xff1…

长江存储致态TiPlus7100 4TB满盘读写测试:性能几乎没有下降

一、前言&#xff1a;看看满盘状态下致态TiPlus7100 4TB性能会如何&#xff01; 现在还有很多同学对于长江存储品牌的存储产品不太信任&#xff0c;在选择SSD时会优先考虑三星、西数这样的品牌。 有鉴于此&#xff0c;我们此次会将手上的长江存储致态TiPlus7100 4TB SSD进行更严…

【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言 在《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础&#xff1a;FLV专题…

鸿蒙跨端实践-JS虚拟机架构实现

作者&#xff1a;京东科技 杜强强 前言 在Roma跨端方案中&#xff0c;JS虚拟机是框架的核心&#xff0c;负责执行动态化的JS代码。在Android平台采用了基于V8的J2V8&#xff0c;iOS平台则使用了系统自带的JSCore&#xff0c;而在HarmonyOS中&#xff0c;由于业界无类似的框架&a…

C++11_左值引用与右值引用

在C11之前&#xff0c;是没有右值引用的概念的&#xff0c;在C11之后才新增了右值引用。其实无论是左值引用还是右值引用都是给对象取别名。 认识左值和右值 什么是左值&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可…

YOLOv11改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

一、本文介绍 本文记录的是改进YOLOv11的损失函数&#xff0c;将其替换成Shape-IoU。现有边界框回归方法通常考虑真实GT&#xff08;Ground Truth&#xff09;框与预测框之间的几何关系&#xff0c;通过边界框的相对位置和形状计算损失&#xff0c;但忽略了边界框本身的形状和…

PV大题--专题突破

写在前面&#xff1a; PV大题考查使用伪代码控制进程之间的同步互斥关系&#xff0c;它需要我们一定的代码分析能力&#xff0c;算法设计能力&#xff0c;有时候会给你一段伪代码让你补全使用信号量控制的操作&#xff0c;请一定不要相信某些人告诉你只要背一个什么模板&#…

Java线程入门

目录 一.线程相关概念 1.程序&#xff08;program&#xff09; 2.进程 3.线程 4.其他相关概念 二.线程的创建 1.继承Thread 2.Runnable接口 3.多线程机制&#xff08;重要&#xff09; 4.start() 三.线程终止--通知 四.线程&#xff08;Thread&#xff09;方法 1.常…

fastAPI教程:数据库操作

FastAPI 六、数据库操作 FastAPI支持操作各种数据库&#xff0c;但本身并没有内置关于任何数据库相关的模块。因此我们可以根据需求使用任何数据库&#xff0c;包括关系型&#xff08;SQL&#xff09;数据库&#xff0c;例如&#xff1a;PostgreSQL、MySQL、SQLite、Oracle、…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) &#xff0c;f(m)指代至少有m个位置不合法的方案数。 怎么求&#xff1f; 注意到位置为id&#xff0c;权值为v ,不合法的情况&#xff0c;当且仅当 v idk或 v id-k 因此&#xff0c;我们把每一个位置和权值抽象成点 &#xff0c;不合法的情况之间连一…

【JVM】基础篇

1 初识JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 1、编写Java源代码文件。 …

自动驾驶系列—深度剖析自动驾驶芯片SoC架构:选型指南与应用实战

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

认知杂谈74《远离渣女陷阱,拥抱健康情感》

内容摘要&#xff1a; 渣女在感情中使用甜言蜜语陷阱&#xff0c;利用男性渴望理解和关爱的心理&#xff0c;通过虚假承诺和情感操控来获得利益。 男性易陷入这种陷阱&#xff0c;因为他们可能因压力大、感性而易受感动。为了避免这种情况&#xff0c;男性需要辨别言行一致性&a…

【含文档】基于Springboot+Vue的国风彩妆网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

软件设计之SSM(4)

软件设计之SSM(4) 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容&#xff1a; 基于配置类方式管理Bean 完全注解开发第三…

共模电感工作原理:【图文讲解】

共模电感&#xff0c;相信做电源较多的朋友用的比较多&#xff0c;而做消费级产品的朋友或许用的不是那么的多。但是还是有必要了解了解。 先上图&#xff0c;看看它长什么样子&#xff1a; &#xff08;实物图&#xff09; &#xff08;结构图&#xff09; 很显然&#xff0…