【力扣一刷】代码随想录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

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.