代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球

news2025/5/24 13:45:27

代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球

文章链接:柠檬水找零        根据身高重建队列        用最少数量的箭引爆气球

视频链接:柠檬水找零        根据身高重建队列        用最少数量的箭引爆气球

1. LeetCode 860. 柠檬水找零

1.1 思路

  1. 情况 1:如果客户支付 5 就直接收下即可;情况 2:如果客户支付 20 就需要 一张 10 和 一张 5 或者 三张 5 来找零;情况 3:如果客服支付 10 就需要 一张 5 来找零。场景就这三个
  2. 在情况 1、2 都是固定应对策略,而情况 3 是有两种应对方式,应该优先使用 一张 10 和 一张 5 来应对,因为 10 元只能用来找零这种情况,并且 5 更万能,如果没有再用 三张 5 来找零
  3. 局部最优:遇到 20 元的情况优先用 10+5 的方式应对
  4. 全局最优:完成整个账单的找零
  5. 定义三个变量 five=0,ten=0,twenty=0,twenty 不定义也行
  6. for(int bill : bills),遍历即可

1.2 代码

//
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;

        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                five++;
            } else if (bills[i] == 10) {
                five--;
                ten++;
            } else if (bills[i] == 20) {
                if (ten > 0) {
                    ten--;
                    five--;
                } else {
                    five -= 3;
                }
            }
            if (five < 0 || ten < 0) return false;
        }
        
        return true;
    }
}

2. LeetCode 406. 根据身高重建队列

2.1 思路

  1. 这题思路和135. 分发糖果一样都有两个维度,本题是 h 和 k,因此像那题一样,不能同时考虑,不然那一定会顾此失彼,先确定一个维度再确定另一个维度。本题先确定哪个呢?
  2. 我们先按照 k 来排序,发现我们既没有把 k 确定下来也没有把 h 确定下来
  3. 因此我们再按 h 来从大到小排序,如果 h 相同 k 就从小到大排,这种方式起码 h 确定下来了,那我们遍历到每个人的时候前面的身高一定是>=他自己的,如果你想他前面有 k 个身高>=他的话,就把他插入到 k 下标的位置即可。由于我们身高是从大到小排序的,我们插入的时候是从大到小遍历去找 k 位置插入的,后面的一定没有前面高,因此插入后并不影响排序
  4. 最开始先给数组排序,按 h 从大到小排序,如果 h 相同,k 就从小到大排序(Java 这里要自己实现)
  5. 定义个二维集合 queue,然后将排完序的数组从头开始遍历,获得 people[i][1] 的插入位置,直接插入到 queue 中即可
  6. return queue 即可( Java 里需要转换一下)
  7. 这里不可以做 people 数组上操作,因为可能会操作同一个元素,因为有可能后面的元素已经插入到前面了,原位置还保留着,就可能重复操作

2.2 代码

//
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        // 身高从大到小排(身高相同k小的站前面)
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];   // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列
            return b[0] - a[0];   //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列
        });

        LinkedList<int[]> que = new LinkedList<>();

        for (int[] p : people) {
            que.add(p[1],p);   //Linkedlist.add(index, value),會將value插入到指定index裡。
        }

        return que.toArray(new int[people.length][]);
    }
}

3. LeetCode 452. 用最少数量的箭引爆气球

3.1 思路

  1. 本题给的二维数组表示的就是气球的左边界和右边界,弓箭是垂直 x 轴往上射的,重叠的气球是可以一起射爆的。
  2. 局部最优:重叠的气球尽量在一起,用一支弓箭去射
  3. 全局最优:用了最少的弓箭数
  4. 本题中没有必要把射爆的气球从数组中移除,只需要记录弓箭数,还有就是如何记录重叠的气球。
  5. 开始先判断数组的长度如果等于 0 就直接 return 0 即可。然后首先我们要进行排序,可以统一按照左边界排序也可以统一按照右边界排序,都可以。这里统一按照左边界排序,让重叠的气球尽量相邻。定义个 result 记录弓箭数,初始化为 1,因为上面已经判断 0 气球的情况了,起始至少都是有一个气球的,后面有需要再额外++
  6. 然后是 for 循环遍历,for(int i=1; i<point.length; i++)从 1 开始是因为后面比较是第 i 个和 第 i-1 个比较
  7. 不重叠的情况:排序后,如果第 i 个气球的左边界大于第 i-1 个气球的右边界 if(point[i][0]>point[i-1][1]),证明一定是不重叠的,就一定需要 result++了。
  8. 重叠的情况:因为我们已经是针对左边界进行排序了,因此只需要判断右边界即可判断相邻的气球是否重叠了,不重叠就是 if(point[i][0]>point[i-1][1]),else 就是重叠了即相当于如果第 i 个气球的左边界小于等于第 i-1 个气球的右边界(point[i][0]<=point[i-1][1])的情况了,为什么有“等于号”,因为题目描述两个气球如果是相邻的话也是可以一个弓箭射的。
  9. 现在问题是知道了相邻两个重叠的情况了,那和下一个重不重叠呢?此时就需要更新我们的右边界,两个气球重叠之后,它们整体的右边界应该是取两个气球的右边界的最小值,为什么是最小值?因为如果取最大值,用一个弓箭只能射爆右边那个气球了,只有取右边界的最小值才能射爆两个气球。point[i][1]=Math.min(point[i-1][1],point[i][1])。
  10. 如果下一个气球的左边界没有大于上面两个气球更新后的右边界,说明和上面两个气球不重合,则上面两个气球就用一支弓箭,这个新的气球就需要另一支弓箭了

3.2 代码

//
/**
 * 时间复杂度 : O(NlogN)  排序需要 O(NlogN) 的复杂度
 * 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
 */
class Solution {
    public int findMinArrowShots(int[][] points) {
        // 根据气球直径的开始坐标从小到大排序
        // 使用Integer内置比较方法,不会溢出
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));

        int count = 1;  // points 不为空至少需要一支箭
        for (int i = 1; i < points.length; i++) {
            if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=
                count++; // 需要一支箭
            } else {  // 气球i和气球i-1挨着
                points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
            }
        }
        return count;
    }
}

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

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

相关文章

StarRocks 荣获 InfoWorld 2023 年最佳开源软件

近日&#xff0c;InfoWorld 公布了 2023 Bossie Awards 获奖名单&#xff0c;StarRocks 作为数据分析领域的明星项目&#xff0c;光荣入列。 InfoWorld 是一家具有全球影响力的信息技术媒体公司&#xff0c;每年都会根据软件对开源界的贡献&#xff0c;发布 Bossie Awards 榜单…

【Javascript】函数返回值的作用

目录 返回值 中断函数 只能写在函数体里面 返回值 function a(){var b3;return b3? 4:5;} console.log(a()); 创建一个函数&#xff0c;给b赋值3&#xff0c; return b3? 4:5; 判断b是不是等于3&#xff0c;如果是就返回4&#xff0c; 如果不是就返回5 中断函数…

JSON数据

一、JSON介绍 Android应用程序界面上的数据信息大部分都是通过网络请求从服务器上获取到的&#xff0c;获取到的数据类型常见的就是JSON。JSON是一种新的数据格式&#xff0c;这种格式的数据不可以直接显示到程序的界面上&#xff0c;需要将该数据解析为一个集合或对象的形式才…

Linux-安装docker-compose

前言&#xff1a;本文建立在服务器中已经存在docker环境的基础上&#xff0c;总结了安装docker-compose过程&#xff0c;以及安装过程中遇到的问题和解决方案。 一、下载docker-compose 在网上找了两种&#xff0c;一种是github官方的&#xff0c;一种是国内的镜像 gitbub官…

Python循环语句(二)

目录 二.for循环1.1for循环的基础语法1.2range语句1.3变量作用域2.for循环嵌套3.循环中断 二.for循环 1.1for循环的基础语法 while循环和for循环的区别 while循环的循环条件是自定义的&#xff0c;自行控制循环条件 for循环是一种轮询机制&#xff0c;是对一批内容进行逐个处…

多种方式计算当天与另一天的间隔天数 Java实现

这里不会记录纯原生写法&#xff0c;因为现在基本都是被工具类封装好的&#xff0c;所以会记录好用的工具类来简化开发&#xff0c;当然自己可以研究写一个年月日各自做减法的纯原生工具类。 踩坑处(System.currentTimeMillis) 这里指的是使用System.currentTimeMillis()方法。…

基于 Qt控制开发板 LED和C语言控制LED渐变亮度效果

## 资源简介 在STM32开发板,板载资源上有两个可自由控制的 LED。如下图原理 图其中我们以操作 LED1 为示例,LED1 为出厂系统的心跳指示灯。 ## 应用实例 想要控制这个 LED,首先出厂内核已经默认将这个 LED 注册成了 gpio-leds类型设备。所以我们可以直接在应用层接口直接…

如何通过内网穿透实现公网远程连接Redis数据库

公网远程连接Redis数据库【内网穿透】 文章目录 公网远程连接Redis数据库【内网穿透】前言1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址…

国内主要的ERP软件有哪几种?谁家的ERP软件好用

不同的企业有不同的管理方式和侧重点&#xff0c;随着市场环境的变化&#xff0c;各行业竞争日趋激烈化&#xff0c;如何降低经营成本&#xff0c;提升产品质量&#xff0c;优化资源配置也成为各个企业努力的重点。 有些企业存在部门之间信息传递不及时、多组织协同效率低、不…

Java API访问HDFS

一、下载IDEA 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionwindows#sectionwindows 拉到下面使用免费的IC版本即可。 运行下载下来的exe文件&#xff0c;注意安装路径最好不要安装到C盘&#xff0c;可以改成其他盘&#xff0c;其他选项按需勾选即可…

2023年软件测试还能不能干,怎么干!听听这些肺腑之言!

“怎么办&#xff1f;我似乎连面试都过不了。” 小玲边喝着陪伴她度过无数熬夜的奶茶&#xff0c;边与朋友分享着自己在软件测试行业的求职之路。 被公司裁员后&#xff0c;小玲虽然通过自学掌握了一些基本的接口自动化和UI自动化测试技能&#xff0c;但面试时总还是遭遇到一些…

英伟达携手联发科打造CPU,威胁英特尔主导地位 | 百能云芯

据路透社报道&#xff0c;英伟达&#xff08;NVIDIA&#xff09;计划采用安谋&#xff08;Arm&#xff09;架构设计中央处理器&#xff08;CPU&#xff09;&#xff0c;进军个人电脑&#xff08;PC&#xff09;市场。外界已指出&#xff0c;联发科是英伟达的合作伙伴&#xff0…

利用Nginx通过内网穿透实现Windows Web多站点远程访问

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

Redis常用知识笔记(超全面!超详细!)收藏这一篇就够了

这里写目录标题 一、Key二、常见的数据类型1、string (字符串&#xff09;1-1 常见命令1-2 案例 2、List&#xff08;列表&#xff09;2-1 常见命令2-2 案例 3、Hash&#xff08;哈希&#xff09;3-1 常见命令3-2 案例 4、Set&#xff08;集合&#xff09;元素唯一不重复4-1 常…

msigdbr hallmarks gsea broad研究所

使用msigdbr r包 #BiocManager::install("msigdb") #https://www.gsea-msigdb.org/gsea/msigdb #https://cran.r-project.org/web/packages/msigdbr/vignettes/msigdbr-intro.html #https://bioconductor.org/packages/release/data/experiment/vignettes/msigdb/ins…

vue3 setup语法糖 搜索

目录 前言 用法 1. 区域 前言 Vue.js 是一款流行的 JavaScript 框架&#xff0c;用于构建用户界面。它提供了一种简洁的方式来创建可维护和可测试的前端应用程序。Vue.js 的核心库只关注视图层&#xff0c;易于上手&#xff0c;同时与其他库或现有项目整合也非常方便。Vue…

解决Maven打包Nacos时插件报错

Maven打包指令&#xff1a;mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue 在执行时报错&#xff0c;报错信息如下&#xff1a; Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile (default) on project nacos-consist…

C语言——有一篇文章,共有 3 行文字,每行有 80 个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数

完整代码&#xff1a; /* 有一篇文章&#xff0c;共有 3 行文字&#xff0c;每行有 80 个字符。要求分别统计出其中英文大写字母、 小写字母、数字、空格以及其他字符的个数*/#include<stdio.h> int main(){//创建一篇这样的文章到二维字符数组中char str[3][80] {&quo…

平面图欧拉公式

V − E P B 1 V-EPB1 V−EPB1 V V V &#xff1a;点数 E E E&#xff1a;边数 P P P&#xff1a;面数&#xff08;含外面&#xff09; B B B&#xff1a;连通块数量 通过这个我们可以处理网格图中的连通块数量问题 上图中有7个点&#xff0c;8条边&#xff0c;3个面&#x…

小红书推广高客单产品的技巧与方法

小红书作为流量市场的一块洼地&#xff0c;这里汇聚着高净值高月活的年轻女性用户&#xff0c;她们更关注高品质、高口碑的优质产品。 在这样的营销氛围下&#xff0c;越来越多高单价产品将目光聚到这里&#xff0c;通过品牌精准营销&#xff0c;有效提升产品曝光和口碑&#x…