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]的方式,当处理很大的整数时,两数相减的结果可能会超出整数范围致使报错🤔🤔🤔

请添加图片描述


总结

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

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

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

相关文章

openai swarm多智能体框架使用案例;调用第三方deepseek大模型接口服务

参考: https://github.com/openai/swarm 安装: pip install git+ssh://git@github.com/openai/swarm.git pip install python-dotenv 代码: .env OPENAI_BASE_URL="https://api.deepseek.com/v1" OPENAI_API_KEY

MPU6050简介

MPU6050是一款集成了三轴加速度计和三轴陀螺仪的六轴传感器模块&#xff0c;由InvenSense公司开发。它广泛应用于运动检测、姿态感知、手势识别、无人机控制等领域。 MPU6050的主要功能与特点 6轴传感器&#xff1a; 三轴加速度计&#xff1a;用于测量物体在X、Y、Z三个轴向上…

【GT240X】如何在 Linux 中格式化磁盘

如何在 Linux 中格式化磁盘 文章目录 一、说明二、关于磁盘分区格式化过程三、如何通过命令行在 Linux 上格式化磁盘3.1 进入管理员&#xff08;root&#xff09;模式3.2 步骤1&#xff1a;查看磁盘情况&#xff0c;找到要分区的盘3.3 步骤2&#xff1a;用gdisk指令创建分区3.4…

ZK集群搭建:详细步骤与注意事项

在大数据和分布式系统日益重要的今天&#xff0c;ZooKeeper&#xff08;简称ZK&#xff09;作为一种分布式协调服务&#xff0c;扮演着举足轻重的角色。它主要用于管理大型分布式系统中的配置信息、命名、同步等。下面将详细介绍如何搭建一个ZooKeeper集群&#xff0c;帮助大家…

文档处理之10种PDF解析工具测评:兼看知识图谱遇见Chart图表的有趣实现思路

我们来围绕文档智能这个方向&#xff0c;一个是10种PDF解析工具6种不同文档类别的测试分析&#xff0c;这个有好落地&#xff0c;能够给出一些具有参考意义的工具。 另一个是关于图表跟知识图谱的结合&#xff0c;ChartKG&#xff0c;其中对于知识图谱的设计、图表要素的抽取以…

基于大模型的招聘智能体:从创意到MVP

正在考虑下一个 SaaS 创意&#xff1f;以下是我在短短几个小时内从创意到 MVP 的过程。 以下是我将在这篇文章中介绍的内容概述&#xff1a; 为什么这个想法让我产生共鸣我是如何开始构建它的我现在的处境以及我是否会真正推出 获得 SaaS 创意并构建它并不容易。就是这样。 …

SD-WAN可以搭建在任何网络上,通过中央控制器管理企业所有用户的终端路由器,实现集中配置和监控。

中国联通国际公司产品之 SD-WAN 在数字化转型的浪潮中&#xff0c;企业对于网络灵活性和高效性的需求日益增长。中国联通国际公司推出的SD-WAN&#xff08;软件定义广域网&#xff09;产品&#xff0c;正是基于这一背景应运而生&#xff0c;它以其独特的技术优势和全球化的网络…

何使用本地 LLMs 为可观察性 AI 助手提供本地部署支持

作者&#xff1a;来自 Elastic David Hope 了解如何为私有或本地部署配置本地 LLM。更多阅读&#xff1a;使用 Elastic 和 LM Studio 的 Herding Llama 3.1。 智能大语言模型已经存在了一段时间&#xff0c;一些客户做的第一件事就是在发生了许多严重的数据泄露事件后采取措施…

nltk_data下载安装

gitee上下载zip下载后解压缩&#xff08;三次&#xff09;packages文件夹改名为nltk_data 找应该放在哪&#xff1a; 放到上面列出的任一位置&#xff1a; 放到正确位置后&#xff1a;

搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程

参考文章&#xff1a; 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客 一、简单介绍 本文开发环境&#xff0c;均为 windows 环境&#xff0c;mac 环境其实也类似 ~ ① 编译proto文件&#xff0c;相关插件 简单介绍&#xff1a; protoc 是编译器&#xff0c;用于将…

数据分析和可视化python库orange简单使用方法

Orange 是一个基于 Python 的数据挖掘和机器学习库&#xff0c;它提供了一系列可视化工具和算法&#xff0c;用于数据分析、机器学习和数据可视化等任务。 一、主要特点 可视化界面&#xff1a;Orange 提供了直观的可视化界面&#xff0c;使得用户可以通过拖放操作构建数据分…

HCIP-HarmonyOS Application Developer 习题(十五)

&#xff08;判断&#xff09;1、在HarmonyOs中发布带权限公共事件&#xff0c;发布者首先要在config.json中申请所需的权限。 答案&#xff1a;正确 分析&#xff1a;发布携带权限的公共事件&#xff1a;构造CommonEventPublishInfo对象&#xff0c;设置订阅者的权限。 &#…

nacos实现配置管理

项目结构 引入依赖 <!--统一配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--读取bootstrap文件--><dependency>&l…

电机学习-Park变换

一、Park变换 坐标关系&#xff1a; I d I α ∗ c o s θ e I β ∗ s i n θ e I_d I_\alpha*cos\theta_e I_\beta*sin\theta_e Id​Iα​∗cosθe​Iβ​∗sinθe​ I q − I α ∗ s i n θ e I β ∗ c o s θ e I_q -I_\alpha*sin\theta_e I_\beta*cos\theta_…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库&#xff0c;常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令&#xff0c;并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

【基于Spring Boot+Unipp的古诗词学习小程序【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

官网&#xff1a; 1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage 2、xlsx SheetJS 中文网 一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出&#xff0c;不可以修改样式&#xff0c;直接xlsx-s…

基于SSM校园拼车系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;司机管理&#xff0c;订单信息管理&#xff0c;接单信息管理&#xff0c;留言信息管理 司机账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;订单信息管理&…

用Spring AI 做智能客服,基于私有知识库和RAG技术

Java智能客服系统运用RAG技术提升答疑精准度 基于Spring ai 的 RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。 它的核心思路是&#xff1a; 首先&#xff0c;将客服QA以Word形式导入到系统中&…

vr体验馆计时收银软件试用版下载 佳易王VR游戏厅计时计费管理系统使用操作教程

一、前言 【软件试用版资源文件下载可以点击文章最后卡片了解】 vr体验馆计时收银软件试用版下载 佳易王VR游戏厅计时计费管理系统使用操作教程 VR体验馆计时计费软件是专门为VR体验馆设计的管理工具&#xff0c;旨在提高服务效率和客户的满意度。软件能够记录客户使用设备的…