LeetCode刷题日记之贪心算法(四)

目录

  • 前言
  • 柠檬水找零
  • 根据身高重建队列
  • 用最少数量的箭引爆气球
  • 总结


前言

在前几篇文章中,我们已经覆盖了贪心算法的基本思路和多种题型。这次我将继续分享几道具有挑战性的贪心题目。希望这篇文章能为大家带来更多解题灵感和技巧✍✍✍


柠檬水找零

LeetCode题目链接

这道题就是能否给顾客正确找零,你的柠檬水摊位卖5美元但你一开始没有零钱,一个整数数组bills,其中每个元素是指第i顾客付的帐,这里注意顾客给的不是5块10块就是20块🤔🤔🤔

请添加图片描述

我们来思路梳理

  • 我们贪心策略就是优先使用大额的零钱进行找零。如果需要找 15 美元,应该优先使用 10 美元加 5 美元的组合,这样可以保留更多的 5 美元零钱,以备后续使用🤔🤔🤔

  • 我们进一步来梳理这里的找零情况,可以维护两个变量, 一个记录 5 美元的数量,一个记录 10 美元的数量。

    • 如果顾客支付 5 美元,不需要找零,直接增加 5 美元的数量🤔
    • 如果顾客支付 10 美元,需要找 5 美元的零,检查是否有足够的 5 美元。如果没有,则返回 false🤔
    • 如果顾客支付 20 美元,需要找 15 美元,优先使用 10 美元加 5 美元的组合进行找零,如果没有 10 美元,则需要使用三张 5 美元进行找零。如果也不能找零,返回 false🤔

逻辑梳理的很清楚了,完整贪心代码如下

class Solution {public boolean lemonadeChange(int[] bills) {int five = 0; //记录手头5美元的数量int ten = 0; //记录手头10美元的数量for(int bill : bills){if(bill == 5){//顾客支付5美元five++;}else if(bill == 10){//顾客支付10美元if(five > 0){five--;ten++;}else{return false;}}else{ //顾客支付20元//优先使用一张10美元和两张5美元if(ten > 0 && five > 0){ten--;five--;}else if(five >= 3){five -= 3;}else{return false;}}}return true;}
}

这道题重点还是找钱逻辑要梳理清楚


根据身高重建队列

LeetCode题目链接

这道题就是说有一群人站成一排,但是它们的顺序不对,一个二维数组,其中每个数组[h,k]其中h是这个人的身高,k是他应该站的位置,含义是指这个人前面有k个身高大于他的人🤔🤔🤔

请添加图片描述

我们来思路梳理

  • 首先按照每个人的身高 h 从高到低排序。如果身高相同,则按照 k(前面有多少个大于等于他的人)从小到大排序。这是因为身高高的人不会受到比他矮的人的影响,身高矮的人则需要依据前面更高的人的数量进行插入🤔🤔🤔
  • 按照排好序的数组依次插入队列。每个人的 k 值表示在最终队列中他应该插入的位置,即他前面有 k 个比他身高高的人。由于数组是从高到低排列的,后续的插入不会影响已经插入的高个子🤔🤔🤔
  • 贪心策略采用优先按照k值处理高个子,这样当身高矮的人插入时,前面已经有了更高的个子,这样保证插入时不影响已插入的高个子🤔🤔🤔

逻辑梳理完毕,完整代码如下

class Solution {public int[][] reconstructQueue(int[][] people) {//排序Arrays.sort(people, (a, b) -> {if(a[0] == b[0]){ return a[1] - b[1];//按k值从小到大排序}else{return b[0] - a[0];//按身高从高到低排序}});//用列表插入元素List<int[]> queue = new LinkedList<>();for(int[] person : people){queue.add(person[1], person);//按照k值插入位置}return queue.toArray(new int[people.length][2]);}
}

可能不好理解的部分

  • Arrays.sort()方法通过比较器Comparator来实现升降序逻辑
    • Comparator 返回负数时,a 被认为比 b “小”,a 被排在 b 前面
    • Comparator 返回正数时,a 被认为比 b “大”,a 被排在 b 后面

这说明Comparator就是默认进行升序排列的,a-b < 0说明a比b小则Comparator会把a排列在前面,反之说明a比b大则会把a放在后面,所以只要把a[1]-b[1]则默认升序k值,反过来b[0]-a[0]则表示降序身高🤔🤔🤔

  • queue.add(index, element),其中index为要插入的位置,element为要插入的元素,当在指定的 index 位置插入一个新元素时,该位置的现有元素以及所有后续元素都会向后移动一位,为新元素腾出位置,该方法十分契合题目重新排序的逻辑🤔🤔🤔

用最少数量的箭引爆气球

LeetCode题目链接

这道题的表述看起来非常的复杂,但实际上就是一个区间重合的问题,就是若干个气球的位置[start, end],然后求最小弓箭数量,弓箭的x如果大于start小于end则就能引爆气球🤔🤔🤔

请添加图片描述

我们来思路梳理

  • 我们需要将气球按照它们的结束坐标(end)进行升序排序。这样做的原因是:如果一支箭可以射中尽可能多的气球,那么它应该射在尽量靠近当前一批气球结束的位置(即最小的 xend 位置)。这可以确保当前射出的箭能够覆盖更多的气球。所以贪心选择在当前气球的结束坐标 xend 处射出一支箭,这样可以保证尽可能多的气球被引爆。当遇到下一个气球的起始坐标 xstart 大于当前箭的射击位置时,意味着需要再射出一支箭。当当前气球无法被已有的箭射中时,更新箭的位置并增加箭的数量🤔🤔🤔

逻辑梳理的很清晰,完整代码如下

class Solution {public int findMinArrowShots(int[][] points) {//按照气球结束位置升序排序Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));int arrows = 1;//初始化箭矢的数量int arrowPos = points[0][1];//初始化当前箭的射出位置for(int i = 1; i < points.length; i++){if(points[i][0] > arrowPos){//如果当前气球的起始位置大于箭的位置,说明需要新的箭arrows++;arrowPos = points[i][1];//更新箭的位置为当前气球的结束位置}}return arrows;}
}

这里有个点和上题排序处理不一样的是Integer.compare(a[1], b[1])不会产生整数溢出问题,这话怎么说呢,如下图所示,如果采用return a[1]-b[1]的方式,当处理很大的整数时,两数相减的结果可能会超出整数范围致使报错🤔🤔🤔

请添加图片描述


总结

通过这几道题目,我们可以看到贪心算法在解决区间、排序、和找零等问题时的强大之处。贪心算法的核心在于每一步都做出局部最优解,从而推导出全局最优解。在解题过程中,贪心策略的选择至关重要,要仔细分析每步局部选择的可行性,并确保这种局部选择能够带来全局最优,希望博主记录的内容能够给大家带来帮助✍✍✍

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

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

相关文章

javaWeb项目-ssm+vue宠物管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmvue宠物管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;V…

Elasticsearch:Redact(编辑) processor

Redact 处理器使用 Grok 规则引擎来隐藏输入文档中与给定 Grok 模式匹配的文本。该处理器可用于隐藏个人身份信息 (Personal Identifying Information - PII)&#xff0c;方法是将其配置为检测已知模式&#xff0c;例如电子邮件或 IP 地址。与 Grok 模式匹配的文本将被替换为可…

hdfs的分布式存储原理

1.想要把一个大文件存储到hdfs,首先进行划分,将文件划分为一个一个的block,这个block默认为512MB,可修改. 2.备份(也就是副本) 将文件划分后,一个block丢失则原来的大文件没有用了.为了确保文件的安全性,hdfs提供了副本,也就是备份,将文件划分之后hdfs默认将每一个block备份到…

xtrabackup工具介绍、安装及模拟数据库故障使用xtrabackup工具恢复数据等操作详细说明

一、xtrabackup工具介绍 Percona XtraBackup Percona XtraBackup是一个适用于MySQL的开源热备份工具&#xff0c;它在备份期间不锁表。它可以备份InnoDB、XtraDB以及MyISAM存储引擎的表。 2.4版本支持MySQL5.1、5.5、5.6以及5.7。 它有两个实用命令&#xff0c;分别是xtraback…

Python之briefcase生成安卓app解决按钮字母变大写问题

最近修改千纬认字&#xff0c;要在按钮上用拼音&#xff0c;发现拼音会自动变成大写的拼音加音调。 查了一下发现是android的问题。 Android学习之Button按钮在程序运行时全部变大写的处理 - 叶是风的眼泪 - 博客园 按照文中写的 在style.xml文件中加入&#xff1a;<item …

初始爬虫13(js逆向)

为了解决网页端的动态加载&#xff0c;加密设置等&#xff0c;所以需要js逆向操作。 JavaScript逆向可以分为三大部分&#xff1a;寻找入口&#xff0c;调试分析和模拟执行。 1.chrome在爬虫中的作用 1.1preserve log的使用 默认情况下&#xff0c;页面发生跳转之后&#xf…

【SPIE出版,EI检索稳定】2024年人机交互与虚拟现实国际会议(HCIVR 2024,11月15-17日)

2024年人机交互与虚拟现实国际会议&#xff08;HCIVR 2024&#xff09; 2024 International Conference on Human-Computer Interaction and Virtual Reality 官方信息 会议官网&#xff1a;www.hcivr.org 2024 International Conference on Human-Computer Interaction and …

Cuda By Example - 7 (光线追踪)

第6章以实现简单的光线追踪为例子&#xff0c;引入了Constant Memory和性能测量方法。 Constant Memory NVIDIA的硬件提供了64K的constant只读内存。定义constant内存的变量&#xff0c;使用关键字__constant__。从constant内存里读取出来的数据&#xff0c;可以缓存起来&…

【Ubuntu18.04命令行code打不开】可能的解决方法

目录 问题&#xff1a;命令行code打不开文件尝试① kimi是这么说的② sudo apt-get install apparmor apparmor_utils③ 在混沌的操作完以上一通后&#xff0c;sudo apt-get install snapd 我试了将近一个小时 : ( so depressed 我只是想用vscode打开个文件夹&#xff0c;我甚至…

Leetcode 1129. 颜色交替的最短路径

1.题目基本信息 1.1.题目描述 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n – 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] …

从零入门AI篡改图片检测(金融场景)#Datawhale十月组队学习

1.大赛背景 在全球人工智能发展和治理广受关注的大趋势下&#xff0c;由中国图象图形学学会、蚂蚁集团、云安全联盟CSA大中华区主办&#xff0c;广泛联合学界、机构共同组织发起全球AI攻防挑战赛。本次比赛包含攻防两大赛道&#xff0c;分别聚焦大模型自身安全和大模型生成内容…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果&#xff0c;发现遇到中文时出现乱码&#xff0c;导致无法正常进行响应断言&#xff0c;很影响工作。于是&#xff0c;察看了其他测试人员的解决方案&#xff0c;发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…

轻松应对PDF编辑难题:四款免费pdf编辑器实测体验

作为一名办公室文员&#xff0c;每天处理各种文件是家常便饭。而PDF文档因其格式稳定、不易篡改的特性&#xff0c;在工作中扮演着重要角色。但编辑PDF文件却不像编辑Word文档那样简单&#xff0c;这就需要一款得心应手的PDF编辑器。今天&#xff0c;我就来分享一下我使用过的几…

如何利用解析器绕过访问控制

0x01 前言 每年blackhat总是会有一些新奇的攻击思路值得大家学习&#xff0c;在2024年blackhat的议题中发现一篇很有意思的文章&#xff0c;作者提出了一套基于邮箱的欺骗攻击思路&#xff0c;利用RFC标准中对SMTP协议中邮箱地址的特性&#xff0c;提供一系列绕过技巧&#xf…

揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

文章目录 前言➰一、关联式容器1.1 关联式容器的概述1.2 关联式容器的工作原理1.3 关联式容器的核心特性 ➰二、键值对2.1 键值对的基本概念2.2 键值对在C中的实现 ➰三、树形结构的关联式容器3.1 树形结构的特点3.2 使用场景 ➰四、set的使用与定义4.1 set的基本特性4.2 set的…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程&#xff0c;并创建美观、一致的用户界面&#xff1f;您的搜索到此为止&#xff01;我们的Flutter UI组件库&#xff08;JUI&#xff09;提供了广泛的预构建、可自定义组件&#xff0c;帮助您快速构建…

RHCE--ntp客户端,时间服务器服务端

NTP 是网络时间协议&#xff08; Network Time Protocol &#xff09;的简称&#xff0c;通过 udp 123 端口进行网络时钟同步。 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器&#xff08; NTP &#xff09;同步&#…

计算机网络:数据链路层 —— 以太网(Ethernet)

文章目录 局域网局域网的主要特征 以太网以太网的发展100BASE-T 以太网物理层标准 吉比特以太网载波延伸物理层标准 10吉比特以太网汇聚层交换机物理层标准 40/100吉比特以太网传输媒体 局域网 局域网&#xff08;Local Area Network, LAN&#xff09;是一种计算机网络&#x…

基于SSM果蔬经营系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品信息管理&#xff0c;类型管理&#xff0c;系统管理&#xff0c;订单管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品信息&#xff0c;广告…