【力扣一刷】代码随想录day35(贪心算法part4:860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 )

本文主要是介绍【力扣一刷】代码随想录day35(贪心算法part4:860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

【860.柠檬水找零】简单题(很简单)

【406.根据身高重建队列】中等题(掌握思路后简单)

【452. 用最少数量的箭引爆气球】中等题


【860.柠檬水找零】简单题(很简单)

思路:

  • 5元的直接收,不需要找钱
  • 10元的只需要找5元
  • 20元的优先找10元,没有10元再全部找5元
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){if (five >= 1){five--;ten++;}else return false;}else{// 如果是付了20,则需要找15元,优先找10元if (ten >= 1 && five >= 1){ten--; // 10元1张five--; // 5元1张}else if (five >= 3){five -= 3; // 5元3张}else return false;}}return true;}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)


【406.根据身高重建队列】中等题(掌握思路后简单)

思路:先按身高 h 从大到小排序,再依照 k 调整顺序

关键:按照身高降序排序后,即使将后面的数组调整到前面,也不会影响前面的 k ,因为前面的肯定比后面的高。

示例:

class Solution {public int[][] reconstructQueue(int[][] people) {// 先按身高h降序排序,身高相同的情况下,按k升序排序Arrays.sort(people, (o1, o2) -> {int res = Integer.compare(o2[0], o1[0]); // h降序if (res != 0) return res;else return Integer.compare(o1[1], o2[1]); // k升序});// 频繁按索引插入,LinkedList(基于链表)的效率高于ArrayList(基于数组)List<int[]> list = new LinkedList<>(); for (int i = 0; i < people.length; i++){list.add(people[i][1], people[i]);  // 按照k调整,相当于从左到右按k为索引在链表中插入对应数组}return list.toArray(new int[people.length][]); // 链表 -> 数组,返回数组,注意要指定数组的类型和长度}
}
  • 时间复杂度: O(nlogn),快速排序
  • 空间复杂度: O(n),额外的链表空间消耗

总结:

1、排序需要重写compare方法,先按身高h降序排序,身高相同的情况下,再按k升序排序

2、调整顺序如果用ArrayList实现,时间复杂度会偏高,最好用LinkedList,而且要想到按k调整顺序相当于按k为索引,依次将people排序后的各个数组插入链表。

3、链表转换为数组的时候,注意toArray()方法默认返回的是Object[]型数组,需要在参数列表中用构造器指定数组的类型和长度。


【452. 用最少数量的箭引爆气球】中等题(偏简单)

思路:

1、按气球的起始位置(左边界)排序

2、使用变量shoot记录上一支箭的范围,判断当前遍历的气球范围是否与上一支箭的范围存在重叠区域:

  • 不存在重叠区域:需要增加一支箭,shoot更新为当前遍历的气球范围。
  • 存在重叠区域:不需要增加箭,只更新shoot的范围,起始位置不变,结束位置取上一个shoot的结束位置和当前遍历气球的结束位置的最小值。
class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0]));int[] shoot = points[0]; // 用于记录上一次射箭的范围int res = 1; // 至少有一个气球,至少射1支箭,初始化为1for (int i = 1; i < points.length; i++){// 必然成立shoot[0] < point[0]int[] point = points[i];// 当前遍历的气球不在上一支箭的范围内,需要多加一支箭,并更新射箭的范围if (shoot[1] < point[0]){res++;shoot = point;}// 当前遍历的气球在上一支箭的范围内,需继续用上一支箭即可,缩窄上一支箭的范围else {shoot[0] = point[0];shoot[1] = Math.min(shoot[1], point[1]);}}return res;}
}

  • 时间复杂度: O(nlogn),快速排序
  • 空间复杂度: O(1)

这篇关于【力扣一刷】代码随想录day35(贪心算法part4:860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896072

相关文章

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python