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

题目与题解

860.柠檬水找零

题目链接:860.柠檬水找零

代码随想录题解:​​​​​​​860.柠檬水找零

视频讲解:贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零_哔哩哔哩_bilibili

解题思路:

        从现实实际的角度出发,为了让手里的零钱尽可能的零碎,以备不时之需,需要找钱时肯定尽量能先找大的就找大的。这道题其实限制颇多,给解题降低了不少难度。

        首先,每个顾客只买一份柠檬水,意味着每个顾客每次消费的金额固定,为5美金。其次,顾客每次只会给5,10,20美金的面额,所以对应的情况是不需要找钱,找5美金,和找15美金。前两种的情况对应的找钱都是固定的,只有找15美金时可能有两种情况:找10+5或5*3。为了手里有更多5美金的零钱,优先找10+5的。代码如下

class Solution {public boolean lemonadeChange(int[] bills) {int[] changes = new int[2];for (int i = 0; i < bills.length; i++) {if (bills[i] == 5) {changes[0]++;} else if (bills[i] == 10) {if (changes[0] > 0) {changes[0]--;changes[1]++;} else {return false;}} else {if (changes[1] > 0 && changes[0] > 0) {changes[0]--;changes[1]--;} else if (changes[0] >= 3) {changes[0] -= 3;} else {return false;}}}return true;}
}

看完代码随想录之后的想法 

        这题其实就是现实的模拟题,基本上也没有什么算法可言,就是把想法写下来。由于这里只需要算5美金和10美金的两种剩余零钱情况,可以不需要用数组,换成普通变量记录,效率更高。

遇到的困难

        无

406.根据身高重建队列

题目链接:406.根据身高重建队列

代码随想录题解:​​​​​​​406.根据身高重建队列

视频讲解:贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列_哔哩哔哩_bilibili

解题思路:

        首先根据身高进行降序排列,如果身高相同的,根据k降序排列。这样做的原因是,身高排序问题本质是一种插入排序,所以每插入一个新的,要保证原来的顺序不受影响。由于身高高的k值不受身高低的k值影响,所以排序的第一个key必然是身高。当二者身高相同时,k值越大的,肯定排的越后,所以优先插入k值小的。

        二维排序结束后,就要按顺序逐一插入队伍了,直接根据当前people[i]的k值,将people[i]插入对应的k位置即可,这样可以保证people[i]的前面不比他矮的人数就是k。        

class Solution {public int[][] reconstructQueue(int[][] people) {Arrays.sort(people, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {if(o1[0] != o2[0]){return o2[0] - o1[0];  //身高降序排列} else {return o1[1] - o2[1];  //前方需要插入人数升序排列}}});List<int[]> result = new ArrayList<>();for (int i = 0; i < people.length; i++) {result.add(people[i][1], people[i]);}return result.toArray(new int[people.length][]);}
}

看完代码随想录之后的想法 

        一开始写排序算法重写了很多次,一直没有想清楚插入排序之前的数组应该如何优先排序,所以怎么都写不对。偷看了一下随想录的排序方法,才写对compare函数。

        此外,虽然list类型可以用来进行插入排序,但其底层实现毕竟是数组,效率不高,换成链表会更好。

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][]);}

遇到的困难

        对于多维度的贪心,还是要一个一个维度想清楚具体的贪心方法,再结合起来,不然很容易想错。

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

题目链接:​​​​​​​452. 用最少数量的箭引爆气球

代码随想录题解:​​​​​​​452. 用最少数量的箭引爆气球

视频讲解:贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球_哔哩哔哩_bilibili

解题思路:

        题目已经提醒了,这道题本质就是求相交区间的问题。如果多个区间同时相交,就只需要一根箭。

        因此,可以先对区间进行排序,以左边界为第一关键字,右边界为第二关键字,得到排序后的区间。然后用arrowPoint记录当前相交区间的范围,初始化为第一个区间的大小,此时需要的箭数量为1。然后遍历所有的区间,如果当前区间的左边界大于arrowPoint右边界,说明区间不相交,所需箭的数量加一,arrowPoint更新为当前区间范围;否则说明当前区间与arrowPoint有相交,此时更新arrowPoint的右边界为二者右边界的更小值即可。

class Solution {public int findMinArrowShots(int[][] points) {if (points.length <= 1) return points.length;Arrays.sort(points, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[0] == o2[0])return Integer.compare(o1[1], o2[1]);return Integer.compare(o1[0], o2[0]);}});int count = 1;int[] arrowPoint = points[0];for (int i = 1; i < points.length; i++) {if (points[i][0] > arrowPoint[1]) {count++;arrowPoint = points[i];} else {arrowPoint[0] = points[i][0];arrowPoint[1] = Math.min(arrowPoint[1], points[i][1]);}}return count;}
}

看完代码随想录之后的想法 

        有一些可以优化的地方:区间排序其实只需要针对左边界,右边界可以不需要;arrowPoint也可以直接用当前point代替,减少一点变量的使用。不过这样涉及到修改point数组了,个人不是特别喜欢。

/*** 时间复杂度 : 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;}
}

遇到的困难

        一开始重写compare方法的时候,直接return o1[0]-o2[0]了,导致有一个测试用例的结果不对,因为相减后结果超过了int的上限,溢出了,后面才改写为Integer.compare,需要吸取一下教训。

今日收获

        又学了很多贪心的方法。感觉贪心的题目与现实比较接近,最好的办法是先实际模拟一遍做法,再看是否有优化空间。

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

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

相关文章

GET请求和POST请求的区别

最为常见的客户端传递参数方式有两种&#xff1a; GET 请求和 POST 请求底层都是基于 TCP/IP 协议实现的&#xff0c;使用二者中的任意一个&#xff0c;都可以实现客户端和服务器端的双向交互。 浏览器地址栏直接输入&#xff1a;一定是GET请求&#xff1b; 超链接&#xff1a;…

从数据采集到可视化展示Node-Red二次开发4G模块

环境监测正逐步迈入数字化、智能化时代。Node-Red作为一种开源流式编程工具&#xff0c;以其强大的数据处理能力和设备集成便捷性&#xff0c;在构建环境监测数据站中发挥着至关重要的作用。钡铼技术支持Node-Red编程开发&#xff0c;支持BLIoTLink软网关和自定义开发非标协议。…

6. TypeScript的枚举类型

在TypeScript中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的数据类型&#xff0c;它允许为一组数值赋予友好的名字。枚举类型在处理一组相关常量时非常有用&#xff0c;比如状态码、方向、月份等。本文将从多个方面深入探讨TypeScript中枚举类型的使用&#xff0…

为什么 MySQL 采用 B+ 树作为索引?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 「为什么 MySQL 采用 B 树作为索引&#xff1f;」这句话&#xff0c;是不是在面试时经常出现。 要解释这个问题&#xff0c;其实不单单要从数据结构的角度出发&#xff0c;还要考虑磁盘 I/O 操作次数&am…

【javaWeb】EL与JSTL

目录 EL表达式&#xff08;Expression Language&#xff09;EL和JSP脚本的区别语法EL操作符EL运算符注意 EL功能EL访问作用域隐式对象示例1&#xff1a;获得应用上下文示例2&#xff1a;获取Cookie对象 JSTL(JavaServerPages Standard Tag Library)JSTL使用步骤JSTL标签分类使用…

【免费题库】华为OD机试 - 单词重量(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述用例解题思路:Java代码:JS代码:Python代码:C代码:C++代码:题目描述 每个句子由多个单词组成,句子中的每个单词的长度都可能不一样,…

【六 (3)机器学习-机器学习建模步骤/kaggle房价回归实战】

目录 文章导航一、确定问题和目标&#xff1a;1、业务需求分析&#xff1a;2、问题定义&#xff1a;3、目标设定&#xff1a;4、数据可行性评估&#xff1a;5、资源评估&#xff1a;6、风险评估&#xff1a; 二、数据收集&#xff1a;1、明确数据需求2、选择数据来源3、考虑数据…

SpringCloud Alibaba Seata 处理分布式事务

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十八篇&#xff0c;即使用 Seata 处理分布式事务。 二、分布式事务问题 当单体应用被拆分成微服务应用…

实现虚拟机Ubuntu与主机Windows之间的复制粘贴

实现步骤 在虚拟机Ubuntu界面&#xff0c;CtrlAltT&#xff0c;新建一个终端 # 卸载已有的工具 sudo apt-get autoremove open-vm-tools# 安装工具open-vm-tools sudo apt-get install open-vm-tools# 安装open-vm-tools-desktop sudo apt-get install open-vm-tools-desk…

【超简单】基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?当您面对成吨的会议录音,着急写会议纪要而不得不愚公移山、人海战术?听的头晕眼花,听的漏洞百出,听的怀疑人生,那么你…

在Android中使用MediaPlayer播放音频和视频

在播放音频中SoundPool是个很好用的类&#xff0c;但是SoundPool只能播放音频&#xff0c;且通常只用来播放较短的音频&#xff0c;这就需要另外的类来实现视频和长音频的播放&#xff0c;那就是MediaPlay 实现MediaPlay的基本步骤是 创建MediaPlay对象调用setDataSource对象…

代码随想录算法训练营Day48|LC198 打家劫舍LC213 打家劫舍IILC337 打家劫舍III

一句话总结&#xff1a;前两题白给&#xff0c;第三题树形DP有点难。 原题链接&#xff1a;198 打家劫舍 滚动数组直接秒了。 class Solution {public int rob(int[] nums) {int n nums.length;int first 0, second nums[0];for (int i 2; i < n; i) {int tmp Math.m…

如何开始用 C++ 写一个光栅化渲染器?

光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术&#xff0c;它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据&#xff08;如点、线、三角形&#xff09;转换…

电商选品难?那是因为你不会用大数据选品工具…

电商选品之所以难&#xff0c;主要有以下几个方面的原因。电商市场更新换代非常快&#xff0c;新的产品不断涌现&#xff0c;旧的产品可能很快就被淘汰。电商选品紧跟市场趋势&#xff0c;不断调整和更新&#xff0c;这对电商运营市场敏感度和反应速度提出了很高的要求。 电商…

110V降9V1A非隔离降压恒压WT5112

110V降9V1A非隔离降压恒压WT5112 嘿&#xff0c;让我来给你说说这个WT5112控制芯片。这可是个厉害的东西&#xff0c;特别适合用在充电器啊、适配器啊还有LED灯这些地方。它最牛的地方就是能稳稳地控制电压和电流&#xff0c;而且还有个什么原边反馈技术让控制得更准。更酷的是…

MySQL_00001_00000

数据准备 员工表&#xff1a;emp Oracle: create table emp ( empno number(4) not null, ename varchar2(10), job varchar2(9), mgr number(4), hiredate date, sal number(7, 2), comm number(7, 2), deptno number(2) ); insert into em…

数据库讲解---(SQL语句--表的使用)【MySQL版本】

零.前言 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第一章】-CSDN博客 数据库-ER图教程_e-r图数据库-CSDN博客 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第二章】【上】-CSDN博客 一.SQL概述 1.1SQL简…

组合逻辑电路中的竞争与冒险

竞争与冒险 进行理想的组合逻辑电路分析与设计时&#xff0c;没有考虑逻辑门的延迟时间&#xff08;原因&#xff09;对电路产生的影响&#xff0c;且认为电路的输入和输出均处于稳定的逻辑电平。 实际上&#xff0c;信号经过逻辑门需要一定的时间。不同路径上门电路数目不同…

【Qt】文件与音视频

目录 一、输入输出设备类 二、文件读写类 三、文件和目录信息类 四、音视频 4.1 音频 4.2 视频 文件操作是应用程序必不可少的部分。Qt作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作…

杂谈 EV之我见

每周至少更新一片博文&#xff0c;没有目的的看代码是没有效率的&#xff0c;带着目的去看代码才会有所得&#xff0c; 目前车载行业火爆&#xff0c;得益于EV和AI技术的发展&#xff0c;汽车从一个传统工业产品&#xff0c;摇身一变成为了前沿科技产品。 小米su7的发布会我看…