day30 452. 用最少数量的箭引爆气球406. 根据身高重建队列860. 柠檬水找零

news/2025/2/23 18:39:03/文章来源:https://www.cnblogs.com/lin0304/p/18732589
    1. 用最少数量的箭引爆气球
      问题描述
      给定一系列气球的水平直径(以区间 [start, end] 表示),要求用最少数量的箭引爆所有气球。每个箭可以水平射中一个区间内的所有气球。
      代码逻辑
      排序:按照气球区间的右端点升序排序。如果右端点相同,则按左端点升序。
      贪心算法:
      初始化箭的数量为1,当前箭的覆盖范围为第一个气球的右端点。
      遍历排序后的气球,如果当前气球的左端点大于当前箭的覆盖范围,则需要再射一箭,并更新当前箭的覆盖范围为该气球的右端点。
      返回结果:最终箭的数量。
      优化思路
      排序优化:直接使用 Arrays.sort(points, (o1, o2) -> o1[1] - o2[1]),避免显式实现 Comparator,代码更简洁。
      逻辑简化:通过排序保证了右端点的顺序,因此无需额外标记数组,直接贪心选择即可。
      时间复杂度
      排序:O(n log n)
      遍历:O(n)
      总复杂度:O(n log n)
      空间复杂度
      排序:O(log n)(取决于排序算法的实现)
      额外空间:O(1)
点击查看代码
//452. 用最少数量的箭引爆气球public int findMinArrowShots(int[][] points) {//效率超低 335ms/*Arrays.sort(points,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {long num =(long)o1[1] - o2[1];if (num<0){return -1;}else if (num>0){return 1;}else {return 0;}}});int count = 0;boolean[] visited = new boolean[points.length];for (int i = 0; i < points.length; i++) {if (visited[i]) continue;visited[i] = true;count++;for (int j = i+1; j < points.length; j++) {if (points[j][0]<=points[i][1]) {visited[j]=true;}}}return count;*/// 按照区间的右端点升序排序Arrays.sort(points,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[1]<o2[1]){return -1;}else if (o1[1]>o2[1]){return 1;}else {return 0;}}});int count = 1; // 箭的数量int end = points[0][1]; // 当前箭的覆盖范围(右端点)for (int i = 1; i < points.length; i++) {if (points[i][0] > end) {//不在范围之内就得再射一箭count++;end = points[i][1];}}return count;}
    1. 根据身高重建队列
      问题描述
      给定一个二维数组 people,其中每个元素是一个长度为2的数组 [h, k],表示身高为 h 的人前面有 k 个人比他高或与他同高。要求重建队列。
      代码逻辑
      排序:按照身高降序排序,若身高相同,则按 k 值升序排序。
      插入:遍历排序后的数组,根据 k 值将每个人插入到结果队列的指定位置。
      返回结果:将结果队列转换为二维数组。
      优化思路
      排序优化:直接使用 Arrays.sort(people, (o1, o2) -> o1[0] != o2[0] ? o2[0] - o1[0] : o1[1] - o2[1]),代码更简洁。
      插入优化:使用 ArrayList 的 add(index, element) 方法,保证插入操作的复杂度为 O(n)。
      时间复杂度
      排序:O(n log n)
      插入:O(n^2)(最坏情况下每次插入都需要移动前面的元素)
      总复杂度:O(n^2)
      空间复杂度
      排序:O(log n)
      额外空间:O(n)(用于存储结果队列)
点击查看代码
//406. 根据身高重建队列public int[][] reconstructQueue(int[][] people) {Arrays.sort(people,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o2[0] - o1[0]==0){//h大小一样的情况下,k小的一定要在大的前面。不能在大的处理好的情况下,再往它的前面插入大于或等于它的人(即只能往前面插入矮个子)return o1[1] - o2[1];}return o2[0] - o1[0];}});List<int[]> ans = new ArrayList<>();for (int[] person : people) {//在保证前面的人都比它高或一样的情况下,便可以确定它的插入位置ans.add(person[1],person);}return ans.toArray(new int[ans.size()][]);}
    1. 柠檬水找零
      问题描述
      柠檬水每杯售价5美元,顾客可能支付5美元、10美元或20美元。要求在每次交易中都能正确找零,判断是否能完成所有交易。
      代码逻辑
      计数:使用一个数组 nums 分别记录5美元、10美元和20美元的数量。
      遍历账单:
      如果收到5美元,直接增加5美元的数量。
      如果收到10美元,增加10美元的数量,并减少5美元的数量(找零)。
      如果收到20美元,优先使用10美元和5美元找零,如果没有10美元,则使用3张5美元找零。
      检查:如果在任何时刻5美元的数量小于0,则返回 false。
      返回结果:如果所有交易都能完成,返回 true。
      优化思路
      变量命名:使用更具语义的变量名(如 five、ten、twenty),使代码更易读。
      逻辑简化:直接用变量记录数量,避免使用数组,减少空间复杂度。
      时间复杂度
      遍历账单:O(n)
      空间复杂度
      额外空间:O(1)(仅使用了几个变量)
点击查看代码
//860. 柠檬水找零public boolean lemonadeChange(int[] bills) {//2msint[] nums = new int[3];for (int i = 0; i < bills.length; i++) {if (bills[i] == 5) {nums[0]++;} else if (bills[i] == 10) {nums[1]++;nums[0]--;}else {nums[2]++;if (nums[1]>0){nums[0]--;nums[1]--;}else {nums[0]-=3;}}if (nums[0] < 0) return false;}return true;//1ms,直接用变量名记录效率更高点/*public boolean lemonadeChange(int[] bills) {// 使用更具语义的变量名int five = 0, ten = 0, twenty = 0;for (int bill : bills) {if (bill == 5) {five++;} else if (bill == 10) {ten++;five--; // 需要找零 5 元if (five < 0) return false; // 如果没有足够的 5 元,直接返回 false} else {twenty++;// 尝试优先使用 10 元 + 5 元找零if (ten > 0) {ten--;five--;} else {five -= 3; // 如果没有 10 元,尝试用 3 张 5 元找零}if (five < 0) return false; // 如果没有足够的 5 元,直接返回 false}}return true;}*/}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

X00221-基于多智能体强化学习的车联网频谱共享python完整代码

研究基于多智能体强化学习的车联网频谱共享问题,其中多个车与车(V2V)链路复用由车与基础设施(V2I)链路占用的频谱。由于高速移动的车联网环境中信道变化快速,导致基站无法收集到准确的瞬时信道状态信息,从而无法进行集中式资源管理。对此,将资源共享建模为一个多智能体…

Week01【ElementPlus Layout 布局】

Week01【ElementPlus Layout 布局】 📅 2025/02/22 Layout 布局【ElementPlus】 通过基础的 24 分栏,迅速简便地创建布局。组件默认使用 Flex 布局,不需要手动设置 type="flex"。 请注意父容器避免使用 inline 相关样式,会导致组件宽度不能撑满(宽度坍塌)。. …

Linux 中 source命令 和 bash命令的区别

001、 Linuxbash和source命令的区别在于,当你用bash命令执行脚本时,它告诉Linux内核创建一个新的Bash进程来读取和执行脚本,将输出复制到原先的shell进程中,并显示下来. 然而source命令是一个外置的shell,它读取和评估当前shell进程中的文件。为此,脚本所做的所有修改都将…

字符串的编码及解码

1. 字符串的编码及解码解释str类型转换为bytes类型为编码bytes类型转换为str类型为解码2. 字符串的编码str类型转换为bytes类型使用字符串encode()方法语法格式:str.encode(encodeing= utf8,errors=strict/ignore/replace)出错方式:strict:严格的;报错。 ignore:忽略;rep…

3.正向传播与反向传播 - 学习率LR - Batch size - 激活函数 - 损失函数

正向传播尽量降低损失函数梯度梯度是一个向量(矢量),函数在一点处沿着该点的梯度方向变化最快,变化率最大。换而言之,自变量沿着梯度方向变化,能够使应变量(函数值)变化最大。如图:如果想要 w 下降最快就沿着梯度的负方向下降,就能降低损失函数方向传播更新各个参数的…

Qt报错error: member access into incomplete type QTcpSocket

现象解决办法 在mainwindow.cpp文件中添加头文件。 #include <QTcpSocket>

Spring Boot中如何优雅地读取Jar包中的Resources目录下的文件

在Java的Spring Boot项目中,我们经常需要从resources目录下读取配置文件或其他资源文件。在本地开发环境中,我们可以轻松地使用绝对路径访问这些文件,但项目一旦打包成Jar包并部署到服务器上,这种访问方式就失效了。 因此,掌握在Jar包中读取resources目录下文件的方法至关…

开学测试总结owo

经过这次的小测,在这次测试中,我个人认为最大的变化,就是逻辑性增强,sql语句的要求更多了, 这就反应了对于web应用开发这门课对我们专业的用处,还有,前端页面的美化,我认为前端代码,多 数交给AI就可以了,但主要是你自己要明白需求到底是什么,你要完成的项目是什么,…

get current user

02 - 从SpringSecurity中获取当前用户 一行搞定 SecurityContextHolder.getContext().getAuthentication().getPrincipal();这里自定义了一个UserDetailsImpl类实现UserDetails接口, 此时loadUserByUsername方法的返回对象的类型也要改成自定义类型(01篇最后那样), 不然报错。测…

自编译Frp 实现二次开发

在使用过程中,我们都是利用作者打包好的包,直接使用。但是现实中,我们可能需要对其进行二开。 因而,本文简单的为大家介绍下frp的二次开发。以修改frps dashboard为例。现在让我们一起来学习吧。修改之前的界面修改后效果 安装GO环境 因为,Frp是基于GO开发的,所以我们需要…

从黑盒到透明:AI Agent 运行监控实战!

你是否遇到过这样的情况:辛辛苦苦开发的 AI Agent 突然失灵了,却不知道是哪个环节出了问题?今天给家人们分享一下如何让 AI Agent 的运行过程透明化。 一、为什么要监控 AI Agent? 传统的对话系统就像一张预先画好的地图,用户只能按照既定路线前进。而 AI Agent 则像是一位…

[2025.2.23] 周记

引言在这周的面试当中,我遇到了几个不是很清楚的题目,回家之后进行学习发现了一些比较有意思的事情,在这里记录一下 这周还发现了一个很有帮助的Java知识网站:Java 基础 - 面向对象 | Java 全栈知识体系1.字符串和常量池 在这次面试当中遇到的一个原题就是 String i = "i&…