力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树

server/2024/10/4 15:32:53/

之前发过一篇,感觉还有深挖的地方,于是又补充一些信息
这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度

题解1 可以帮助复习线段树的使用,题解2 可以复习一下java基础知识

题解1 线段树

这是自己憋出来的线段树
在这里插入图片描述

  class SeatManager {public SeatManager(int n) {  // 假设座位都是0 如果坐了人就设置为1 如果返回座位就减去1  需要找到靠左边的最小值。int length = n + 1;right = n;arr = new int[length];minArr = new int[length * 4];}int[] arr;int[] minArr;int left = 1;int right;int root = 1;public int reserve() {int res = getMin();update(res, 1);return res;}public void unreserve(int seatNumber) {update(seatNumber, -1);}public int getMin() {return getMin(left, right, root);}public int getMin(int left, int right, int node) {if (left == right) {return left;}int mid = (left + right) / 2;int res;if (minArr[node * 2] == 0) {  // 只要左边的最小值还是0,那么需要的点必然还在左边res = getMin(left, mid, node * 2);} else {res = getMin(mid + 1, right, node * 2 + 1);}return res;}public void update(int index, int value) {update(index, value, left, right, root);}public void update(int index, int value, int left, int right, int node) {if (left == right) {// 更新值arr[left] += value;minArr[node] = arr[left];return;}// 这里需要对arr进行更新操作int mid = (left + right) / 2;if (index <= mid) {update(index, value, left, mid, node * 2);}if (index > mid) {update(index, value, mid + 1, right, node * 2 + 1);}minArr[node] = Math.min(minArr[node * 2], minArr[node * 2 + 1]);}}

这里是抄别人思路憋出来的线段树
在这里插入图片描述

class SeatManager {public SeatManager(int n) {int length = n + 1;right = n;hasSeatArr = new int[length * 4]; // 先假设1,都是有座位的Arrays.fill(hasSeatArr, 1);}int[] hasSeatArr;int left = 1;int right;int root = 1;public int reserve() {int res = getMin();update(res, 0);return res;}public void unreserve(int seatNumber) {update(seatNumber, 1);}public int getMin() {return getMin(left, right, root);}public int getMin(int left, int right, int node) {if (left == right) {return left;}int mid = (left + right) / 2;int res;if (hasSeatArr[node * 2] > 0) {  // 只要左边有座位,就往左边移动res = getMin(left, mid, node * 2);} else {res = getMin(mid + 1, right, node * 2 + 1);}return res;}public void update(int index, int value) {update(index, value, left, right, root);}public void update(int index, int value, int left, int right, int node) {if (left == right) {hasSeatArr[node] = value;return;}// 这里需要对arr进行更新操作int mid = (left + right) / 2;if (index <= mid) {update(index, value, left, mid, node * 2);}if (index > mid) {update(index, value, mid + 1, right, node * 2 + 1);}hasSeatArr[node] = Math.max(hasSeatArr[node * 2], hasSeatArr[node * 2 + 1]); // 只要有一个有位置就可以了}}

作者写题解的时候说是接近双百,但是我抄他的跑了一下,和赋值他的跑了一下,排名都不高。可能当年写题解写的比较早

题解2


TreeSet是红黑树
PriorityQueue是完全二叉树
前者的 iterator是有序的,后者是不保证有序的

这里就是简单的将treeSet改成了PriorityQueue

    class SeatManager {// 将初始化的时间给优化了,min用1开始发放,不断累加。如果有回收的作为用treeSet收集。如果treeSet不为空,优先从treeSet弹出安排座位
//        TreeSet<Integer> treeSet = new TreeSet<>();private final PriorityQueue<Integer> queue = new PriorityQueue<>();int min = 1;public SeatManager(int n) {}public int reserve() {if (queue.isEmpty()) {int res = min;min++;return res;} else {return queue.poll();}}public void unreserve(int seatNumber) {queue.add(seatNumber);}}

在这里插入图片描述


http://www.ppmy.cn/server/127002.html

相关文章

仿RabbitMQ实现消息队列服务端(一)

文章目录 交换机数据管理队列数据管理绑定信息(交换机-队列)管理队列消息管理虚拟机管理交换机路由管理队列消费者/订阅者管理 整体框架&#xff1a;工具模块及项目整体模块框架 交换机数据管理 交换机数据管理就是描述了交换机应该有哪些数据 定义交换机数据类 1、交换机的名…

66 使用注意力机制的seq2seq_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录动机加入注意力总结代码定义注意力解码器训练小结练习 我们来真的看一下实际应用中&#xff0c;key&#xff0c;value&#xff0c;query是什么东西&#xff0c;但是取决于应用场景不同&#xff0c;这三个东西会产生变化。先将放在seq2seq这个…

Llama 3.2 使用指南:工作原理及示例

Meta AI 宣布发布 Llama 3.2,该版本引入了系列中的首批多模态模型。Llama 3.2 专注于两个关键领域: 启用视觉的大型语言模型(LLM):11B 和 90B 参数的多模态模型现在可以处理并理解文本和图像。为边缘和移动设备设计的轻量级 LLM:1B 和 3B 参数模型旨在轻量化和高效,允许…

基于php摄影门户网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

SLF4J报错log4j又报错

项目场景&#xff1a; 搭建一个spirngboot项目&#xff0c;启动运行时&#xff0c;SLF4J报错 解决后 ~ log4j又报错了。 问题描述 首先是SLF4J报错了&#xff0c;解决完SL4J报错问题后&#xff0c;再次启动项目&#xff0c;log4j又报错了 。。。 报错信息&#xff1a; SLF4J…

sql-labs:42~65

less42&#xff08;单引号闭合、报错回显&#xff09; login_useradmin login_password123 and if(11,sleep(2),1) # # 单引号闭合 ​ login_useradmin login_password123and updatexml(1,concat(0x7e,database(),0x7e),1)# # 报错回显…

[linux] 磁盘清理相关

在 CentOS 7 中清理磁盘空间可以通过多种方法实现&#xff0c;以下是一些常用的步骤和命令&#xff1a; 1. 查找和删除大文件 你可以使用 find 命令查找占用大量空间的文件&#xff1a; find / -type f -size 100M 2>/dev/null这条命令会查找大于 100 MB 的文件。你可以根…

工地安全反光衣穿戴监测报警摄像机

工地安全反光衣穿戴监测报警摄像机 是为了提高工地施工人员的安全意识和监管效率而设计的。这种设备结合了反光衣、监测系统和报警摄像机的功能&#xff0c;可以有效减少工地事故的发生。 首先&#xff0c;工地安全反光衣是一种具有高度可见度的服装&#xff0c;能够使穿戴者在…