代码随想录刷题day35|柠檬水找零根据身高重建队列最少的箭引爆气球

文章目录

  • day35学习内容
  • 一、柠檬水找零
    • 1.1、思路
    • 1.2、代码-正确写法
  • 二、根据身高重建队列
    • 2.1、思路
    • 2.2、正确写法1
      • 2.2.1、 如何理解上面这段代码
      • 2.2.2、 如何理解 que.add(p[1], p)?
      • 2.2.3、这段代码贪心在哪里呢?
  • 三、最少的箭引爆气球
    • 3.1、思路
    • 3.2、正确写法1
  • 总结
    • 1.感想
    • 2.思维导图


day35学习内容

day35主要内容

  • 柠檬水找零
  • 根据身高重建队列
  • 最少的箭引爆气球

声明
本文思路和文字,引用自《代码随想录》

一、柠檬水找零

860.原题链接

1.1、思路

思路比较简单,

  • 如果顾客支付了5美元(bills[i] == 5),则不需要找零,直接将5美元钞票的数量five增加1。
  • 如果顾客支付了10美元(bills[i] == 10),需要找回一张5美元的钞票作为零钱。这时,将5美元钞票的数量five减少1,并将10美元钞票的数量ten增加1。
  • 如果顾客支付了20美元(bills[i] == 20),有两种找零方式:
    • 首先尝试使用一张10美元和一张5美元的组合找零(如果有的话),这样ten减少1,five也减少1;
    • 如果没有10美元钞票,则需要使用三张5美元钞票找零,这时five减少3。

1.2、代码-正确写法

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        int twenty = 0;
        for (int i = 0; i < bills.length; i++) {
            // 五元找零
            if (bills[i] == 5) {
                five++;
            }
            if (bills[i] == 10) {
                five--;
                ten++;
            }
            // 二十找零
            if (bills[i] == 20) {
                // 如果有10元钞票,优先使用10元的
                if (ten > 0) {
                    ten--;
                    five--;
                } else { // 如果没有10元的,需要三张才能找零
                    five -= 3;
                }
            }
            if (five < 0 || ten < 0) {
                return false;
            }
        }
        return true;
    }
}

二、根据身高重建队列

406.原题链接

2.1、思路

  1. 先处理身高高的人

    • 首先对数组进行排序,身高高的人(h值大)排在前面,如果身高相同,则k值小的(即前面应有较少的人高于或等于他)排在前面。
    • 这样的排序策略很好理解吧,要满足题意要求,只能K更小的数排在前面咯
  2. 利用链表高效插入的特性

    • 使用LinkedList来存储最终的队列,因为链表支持在任意位置插入元素,而这正是重建队列时所需要的。
    • 遍历排序后的数组,对于每个人,根据其k值(即p[1]),将其插入到链表的第k个位置。这里的k值实际上代表了在当前已排序且插入的人中,应有k个人的身高大于或等于当前人。

2.2、正确写法1

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        // 身高从大到小排(身高相同k小的站前面)
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0])
                return a[1] - b[1];
            return b[0] - a[0];
        });

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

        for (int[] p : people) {
            // Linkedlist.add(index, value)
            que.add(p[1], p);
        }

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

2.2.1、 如何理解上面这段代码

  1. 排序:首先,对数组people进行排序。排序的规则是按照身高h降序排列,如果身高相同,则按照k值升序排列。这样做的目的是先处理身高较大的人。因为他们在排列时,其前面的人数k直接对应他们在队列中的位置,不会被身高更低的人影响。

  2. 队列重建:创建一个LinkedList(链表)que用于存放最终的队列。遍历排序后的people数组,对于每一个人p,根据其k值将其插入到que的第k个位置。由于链表支持在任意位置高效插入元素,这里使用LinkedList而不是普通的ArrayList

  3. 插入操作:对于que.add(p[1], p);这个操作,p[1]是当前人的k值,表示他前面应有k个人身高大于等于他。由于前面已经按照身高降序排列,此时插入的位置就是这个人在最终队列中的准确位置。

  4. 返回结果:最后,将链表que转换为二维数组形式并返回。

2.2.2、 如何理解 que.add(p[1], p)?

p[1]其实就是k。
在这里插入图片描述
在Java中,LinkedList提供了一个非常有用的方法add(int index, E element),它允许你在链表的指定位置index插入元素element。这个特性在很多情况下非常有用,尤其是当你需要保持列表中元素的某种顺序时。

在这段代码que.add(p[1], p);中,que是一个LinkedList,用于存放按一定规则排序后的人。p是一个包含两个元素的数组,其中p[0]表示人的身高,p[1]表示在重建的队列中,该人前面应有的、身高大于等于该人身高的人数。

这里p[1]作为add方法的第一个参数,指定了p应该被插入que的位置。这意味着在p被插入后,它前面恰好有p[1]个人。这正好符合题目的要求,即每个人前面有k个身高大于等于他的人。

举个例子,假设某个人p的身高为160cm,p[1]值为2,这意呀着在重建的队列中,这个人前面应有2个身高大于等于160cm的人。当执行que.add(2, p);时,就是将这个人插入到链表的第3个位置(因为索引是从0开始的),从而确保他前面有2个人。

2.2.3、这段代码贪心在哪里呢?

  1. 排序策略:首先,通过对people数组进行特定的排序,将身高从高到低排列,当身高相同时,按照k值(即前面应有的身高不低于当前人的人数)从小到大排列。这种排序策略是贪心策略的核心,因为它先处理了身高较高的人。处理这些人时,我们可以简单地根据他们的k值将他们放置在结果队列中的正确位置,因为他们是目前最高的,所以不需要担心后来的人会对他们的位置产生影响。

  2. 插入策略:在将人插入队列时,每个人根据其k值(即p[1]),被直接插入到最终队列的第k个位置(考虑到链表索引从0开始,实际上是第k+1个位置)。这里的贪心思想在于假设在当前人之前的所有人都已经被正确放置,那么根据当前人的k值直接确定其位置就是最优的。这个假设是基于排序步骤确保的,即在当前人之前只会有身高等于或大于他的人,这样就满足了他的k值的要求。

  3. 总结:它总是寻找局部最优解(即在当前步骤中,根据已排序的顺序和k值将每个人放置在可能的最终位置),并且通过这种局部最优解的连续选择,达到了全局最优解(即重建的队列满足题目条件)。通过排序使得问题简化,然后逐个按照k值插入到队列中的策略,保证了每一步都是在当前情况下的最优选择。


三、最少的箭引爆气球

452.原题链接

3.1、思路

说实话,没太想明白这一题,,,
主要就是需要处理气球间的重叠情况

  • 如果当前气球的起始坐标大于前一个气球的结束坐标,说明这两个气球不重叠,需要另外一支箭,因此箭的数量count加1。
  • 如果当前气球与前一个气球重叠(即当前气球的起始坐标不大于前一个气球的结束坐标),则更新当前气球的结束坐标为两个气球结束坐标中较小的一个。这是为了最小化重叠区域的右边界,确保下一支箭能射中尽可能多的重叠气球。
    贪心体现在哪里?
    关键在于通过排序简化了问题,将其转化为了一个区间重叠问题,然后通过贪心的策略,每次尽可能在重叠区域射箭,以最小化所需的箭数

3.2、正确写法1

class Solution {
    public int findMinArrowShots(int[][] points) {
        // 根据气球直径的开始坐标从小到大排序
        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]) {
                count++; // 需要一支箭
            } else { // 气球i和气球i-1挨着
                // 需要更新重叠气球最小右边界
                points[i][1] = Math.min(points[i][1], points[i - 1][1]);
            }
        }
        return count;
    }
}

总结

1.感想

  • 【根据身高重建队列】和最【少的箭引爆气球】都不太会写,一边看题解一边抄的题解。。。

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。-

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5s处理二维牙齿数据集

一、网络结构 二、输入输出 1、输入 640x640的图像 2、输出 权重文件 测试图像 三、数据预处理 在github上下载YOLOv5的模型&#xff0c;并安装模型所需环境 pip install -U -r requirements.txt 四、训练&测试 对数据集进行训练 python train.py --img 640 --batc…

mybatis 实验报告1

文章目录 新建数据库新建项目&#xff0c;并导入jar包添加配置文件conf.xml定义实体类定义操作表user的sql的映射文件 userMapper.xml注册&#xff1a;将mapper.xml文件注册到conf.xml配置文件中一共6步&#xff0c;这个只是测试类&#xff0c;这个不算 新建数据库 命名是 随便…

4、事件修饰符、过滤器、自定义指令、生命周期

一、事件修饰符 按键别名enter 回车 delete 删除键 esc取消键 space 空格键 <script> export default {name: "KeyUp",methods:{keyUp(e){ console.log(e) }},skip(){window.location.href "http:www.xx.com"} } </script> <template>…

BUUCTF-Misc14

[WUSTCTF2020]find_me1 1.打开附件 是一个学校的校徽 2.盲文解密 发现图片属性里的备注是一串盲文 用在线盲文解密 3.得到flag

第三十一天-Flask-ORM-sqlalchemy

目录 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 ​编辑 4.插入修改删除 5.查询 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 4.插入修改删除 5.查询

001_Python(PyCharm,Anaconda,Jupyter更改工作目录)

# 整理笔记&#xff0c;记录一下Python学习过程&#xff0c;希望对像我一样的初学者有所帮助&#xff01; 一、Python三个基本概念 1、解释器 Python解释器&#xff0c;是将高级语言解析为二进制机器语言的工具。 通常说的安装python就是指安装python解释器。 目前最新的P…

基于springboot+vue调用百度ai实现车牌号识别功能

百度车牌号识别官方文档 结果视频演示 后端代码 private String getCarNumber(String imagePath, int count) {// 请求urlString url "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";try {byte[] imgData FileUtil.readFileByBytes(imagePath);Stri…

【如何安装odl: 1.0.0.dev0】

【如何安装odl: 1.0.0.dev0】 ODL官网 pip install odl可能容易报错&#xff0c;建议使用下述命令安装 pip install https://github.com/odlgroup/odl/archive/master.zip检查是否安装成功 conda list

练习二 霍格沃兹登录页面

1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>教务系统管理页面</title><link rel"stylesheet" href"./教务管路系统页面.css"> </head> <body&g…

Spring Data Elasticsearch 与ES版本对应关系记录

参考&#xff1a; Versions :: Spring Data Elasticsearch

cpp第二次作业

现象&#xff1a; 源码&#xff1a; #include <iostream>using namespace std;class Rectangle{ private:int length;int width; public:void set_l(int l);void set_w(int w);int get_l();int get_w();void show(); };void Rectangle::set_l(int l) {lengthl; }void Re…

javaWeb健康管理系统

一、引言 1.1 设计背景 紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检&#xff0c;教职工人入职体检&#xff0c;以及所有学生和教职工的定期体检…

使用小皮【phpstudy】运行Vue+MySql项目

现在的情况是我扒到了一个开源的项目&#xff0c;现在想要实现一下前端对应的功能&#xff0c;后端是完备的&#xff0c;但是需要调用数据库将数据跑起来&#xff0c;这里可以使用到MySql数据库&#xff0c;这里我还发现了一个比较好用的软件小皮【phpStudy】 官网 一 安装软件…

前端面试拼图-数据结构与算法(二)

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1. 求一个二叉搜索树的第k小值 二叉树(Binary Tree) 是一棵树 每个节点最多两个子节点 树节点的数据结构{value, left?, right?} 二叉树的遍历 前序遍历&#xff1a;root→left→right 中…

ArcGIS:焦点统计权重weight的设置方法

ArcGIS中的焦点统计可以用于计算指定邻域大小内的统计值&#xff0c;并重新赋给中心像元。其中可以通过未邻域内每个元素赋权重新计算&#xff0c;下面介绍下如何设置核文件。 1、新建一个txt文件 2、在txt里面写好权重&#xff0c;按照ArcGIS里面的帮助&#xff0c;3*3窗口如…

树和森林解析

01.下列关于树的说法中&#xff0c;正确的是&#xff08;D). Ⅰ.对于有n个结点的二叉树&#xff0c;其高度为log2n Ⅱ.完全二叉树中&#xff0c;若一个结点没有左孩子&#xff0c;则它必是叶结点 Ⅲ.高度为h (h>0)的完全二叉树对应的森林所含的树的个数一定是h IV.一棵树中的…

Python中的数据类型有四类八种如何理解?

在Python中&#xff0c;数据类型大致可以分为四大类&#xff0c;包含了八种基本的数据类型&#xff0c;这些分类有助于理解和使用Python进行编程。这四大类分别是&#xff1a; 数字类型 (Numeric Types): 整型 (int): 表示没有小数部分的整数&#xff0c;可以是正数、负数或零。…

2024年【熔化焊接与热切割】考试报名及熔化焊接与热切割找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割实操考试视频很简单。 1、【单选题】 下…

nandgame中的控制单元(Control Unit)

关卡说明的翻译&#xff1a; 控制单元除了ALU指令之外&#xff0c;计算机还应支持数据指令。在数据指令中&#xff0c;指令值直接写入A寄存器。创建一个控制单元&#xff0c;根据指令I的高位执行数据指令或ALU指令&#xff1a;位 15 0 数据指令 1 ALU指令ALU指令 对于ALU指令&…

一阶低通滤波

一阶低通滤波是一种信号处理技术&#xff0c;用于去除信号中高频部分&#xff0c;保留低频部分。在滤波过程中&#xff0c;一阶低通滤波器会使得高于某个截止频率的信号被衰减&#xff0c;而低于截止频率的信号则会被保留。这有助于减少噪音或者不需要的信号成分&#xff0c;从…