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

news2024/11/22 21:04:41

之前发过一篇,感觉还有深挖的地方,于是又补充一些信息
这题目虽然是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.coloradmin.cn/o/2182319.html

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

相关文章

免费送源码:Java+ssm+MySQL springboot健康医疗系统 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展&#xff0c;人们对医疗管理的需求越来越大&#xff0c;各种健康医疗系统也都在被广泛应用&#xff0c;对于医疗管理的各种软件也是备受用户的喜爱&#xff0c;健康医疗系统被用户普遍使用&#xff0c;为方便用户能够可以随时进行健康医疗系统的数据…

【JAVA开源】基于Vue和SpringBoot的美容院管理系统

本文项目编号 T 055 &#xff0c;文末自助获取源码 \color{red}{T055&#xff0c;文末自助获取源码} T055&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

NAL 网络提取层(Network Abstraction Layer)

1.NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中&#xff0c;无论是存储还是网络传输&#xff0c;H264 原始码流是由一个接一个 NALU&#xff08;NAL Unit&#xff09; 组成&#xff0c;整个系统框架被分为两个层面&#xff1a;视频编码层面&#…

uniapp学习(003-1 vue3学习 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第11p-第p14的内容 文章目录 vue3使用介绍插值表达式例子时间戳随机数输出函数的值 ref响应式数据变量v-bind 绑…

PCL CropBox 过滤给定立方体内的点云数据

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 点云裁剪 2.1.2 可视化原始点云和裁剪后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长…

Python办公自动化案例:批量修改Word文件中的段落格式

案例:Python实现批量修改Word文件中的段落格式。 在处理大量Word文档时,经常需要批量修改这些文档的格式,比如统一段落格式,以提升文档的一致性和专业性。使用Python来实现这一任务可以极大地提高工作效率,特别是当涉及到数百或数千个文档时。Python通过第三方库如python…

【C#】CacheManager:高效的 .NET 缓存管理库

在现代应用开发中&#xff0c;缓存是提升性能和降低数据库负载的重要技术手段。无论是 Web 应用、桌面应用还是移动应用&#xff0c;缓存都能够帮助减少重复的数据查询和处理&#xff0c;从而提高系统的响应速度。然而&#xff0c;管理缓存并不简单&#xff0c;尤其是当你需要处…

《RabbitMQ篇》Centos7安装RabbitMQ

安装RabbitMQ 安装包网盘下载地址 链接&#xff1a;https://pan.baidu.com/s/1bG_nP0iCdAejkctFp1QztQ?pwd4mlw 先上传安装包到服务器&#xff08;erlang-23.3.4.11-1.el7.x86_64.rpm和rabbitmq-server-3.9.16-1.el7.noarch.rpm&#xff09;然后使用指令安装 # 安装 erlang r…

掌握 JVM 垃圾收集线程:简化 VM 选项

垃圾收集阶段对于任何 Java 应用程序都至关重要。主要目标是保持高吞吐量和低延迟之间的平衡。通过配置垃圾收集器&#xff0c;我们可以提高性能&#xff0c;或者至少推动应用程序朝着特定的方向发展。 垃圾收集周期越短越好。因此&#xff0c;分配给垃圾收集器的资源越多&…

昇思MindSpore进阶教程--下沉模式

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文开始 昇腾芯片集成了AICORE和AICPU等…

C#自定义工具类-数组工具类

目录 数组工具类基本操作 1.排序&#xff1a;升序&#xff0c;降序 2.查找 1&#xff09;查找最值&#xff1a;最大值&#xff0c;最小值 2&#xff09;查找满足条件的单个对象 3&#xff09;查找满足条件的所有对象 4&#xff09;选取数组中所有对象的某一字段 完整代…

河南做网站与SEO:如何提升搜索引擎排名

河南做网站与SEO&#xff1a;如何提升搜索引擎排名 在当今数字化时代&#xff0c;越来越多的企业意识到互联网的重要性&#xff0c;特别是在河南这样一个快速发展的地区&#xff0c;建立一个优秀的网站已经成为企业发展的必要条件。而在建立网站的同时&#xff0c;SEO&#xff…

--- java数据结构 map set ---

java中map 和 set的底层实现是通过搜索树和哈希函桶来实现 搜索树 二叉搜索树有叫二叉排序树 他具有以下的特点 若存在左节点&#xff0c;那么他左节点的值一定小于根节点 若存在右节点&#xff0c;那么他右节点的值一定大于根节点 它的左右子树也是搜索树 对他进行中序…

leetcode热题100.最长公共子序列

题目 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…

SOMEIP_ETS_143: SD_Request_non_existing_ServiceID

测试目的&#xff1a; 验证DUT能够拒绝一个请求不存在的服务ID&#xff08;ServiceID&#xff09;的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个请求不存在服务ID的Subs…

RS485串口通信:【图文详讲】

RS485&#xff0c;RS的意义为Recommended Standard的缩写&#xff0c;也就是推荐标准&#xff0c;是一种常用的半双工-异步-串行通信总线。半双工的意思就是两者通信时&#xff0c;同一时刻&#xff0c;只能由其中一方发送&#xff0c;另一方只能接收&#xff0c;不可以同时收发…

vue3 antdv3/4 Modal显示一个提示,内容换行显示。

1、官网地址&#xff1a; Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、显示个信息&#xff1a; Modal.info({title: This is a notification message,content: h(div, {}, [h(p, some messages...some messages...),h(p, some …

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息&#xff1a; 论文题目&#xff1a;基于解压缩模块的JPEG同步重压缩检测 作者&#xff1a;王金伟1 &#xff0c;胡冰涛1 &#xff0c;张家伟1 &#xff0c;马 宾2 &#xff0c;罗向阳3 &#xff08;1.南京信息工程大学计算机学院、网络空间安全学院&#xf…

Linux-L11-查看本机ip地址

linux查看ip地址 查看自己的IP地址使用 ip 命令&#xff1a;使用 ifconfig 命令使用 hostname 命令&#xff1a;使用 nmcli 命令 查看某个特定接口的IP查看公网IP地址 在Linux系统中&#xff0c;查看自己的IP地址可以通过多种方式实现&#xff0c;这里提供几种常用的方法&#…

Stable Diffusion绘画 | LCM模型:实现秒出图

在过往&#xff0c;不管使用 SD 还是 MJ&#xff0c;生成一张图片起码要等上10秒。 而现在&#xff0c;有了 LCM 技术的加持&#xff0c;已经能做到秒出图&#xff0c;甚至是实时出图。 LCM(潜空间一致性模型) 是由 清华大学信息科学技术研究院 研发的大模型&#xff0c;它最…