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

目录

  • 前言
  • 买卖股票的最佳时机II
  • 跳跃游戏
  • 跳跃游戏II
  • 总结


前言

在上一篇贪心算法的学习中,我们探讨了贪心算法的基本思路和逻辑框架。在这篇文章中,我将继续分享几道经典的LeetCode贪心算法题,并探讨其背后的解题思路和技巧。希望通过这些题目的实践,能加深我对贪心算法的理解,也为同样在刷题的小伙伴提供更多思考和启发✍✍✍

买卖股票的最佳时机II

LeetCode题目链接

这道题就是给一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格,然后每天你可以选择购入或者卖出,要求最大利润🤔🤔🤔

请添加图片描述

我们来思路梳理

  • 我们使用贪心算法,通过局部最优来计算全局最优,如果今天的价格高于昨天的价格,我们就在昨天买入、今天卖出,赚取当天的差价🤔 通过不断选择局部最优解(每天都尽可能买卖股票赚取差价),累加所有的利润,最终获得最大利润🤔只要今天的价格比前一天高,就可以视为一个机会进行交易,赚取当天的利润。通过这样的贪心选择,可以确保我们获得最大利润🤔

很清晰的思路,我们直接来编码

class Solution {
    public int maxProfit(int[] prices) {
        int maxProfit = 0; //初始化最大利润为0

        //从第二天开始遍历数组
        for(int i = 1; i < prices.length; i++){
            //判断局部最优
            if(prices[i] > prices[i - 1]) maxProfit += prices[i] - prices[i - 1];//累加今天和昨天的差值作为利润
        }
        return maxProfit;
    }
}

代码也很简单,我们继续来学习下一道题✍✍✍

跳跃游戏

leetCode题目链接

这道题就是一个整数数组,数组每个数表示你在这个位置的最大可跳跃长度,初始在数组第一个下标,然后判断你能不能跳到数组最后一个下标处🤔🤔🤔

请添加图片描述

我们来思路梳理

  • 这道题我们用贪心算法去解决的话,它的目标是判断能否从数组的第一个位置跳跃到最后一个位置,我们的核心思路就是在遍历数组的过程中 维护一个当前能到达的最远位置并逐步更新这个最远位置,判断它是否能够覆盖到最后一个下标🤔🤔🤔

这么说可能还是不够清晰,我们展开思路

  • 每次在当前位置 i,根据当前元素 nums[i] 表示的最大跳跃长度,计算从当前位置能够跳到的最远位置。如果最远位置超过或等于数组的最后一个下标,说明可以到达。通过不断更新能够跳到的最远位置,确保我们总是选择最远的跳跃路径,以尽可能覆盖更多位置。如果最远位置最终覆盖到数组末尾,则可以到达最后一个下标🤔🤔🤔

这样已经很清楚了我们来进行编码

class Solution {
    public boolean canJump(int[] nums) {
        int maxReach = 0;//初始化最远可达位置

        for(int i = 0; i < nums.length; i++){//遍历数组元素
            //判断局部最优的可行性
            if(i > maxReach)return false;//已经超出最远可达位置了

            //更新问题状态
            maxReach = Math.max(maxReach, i + nums[i]);//更新最远可达位置

            if(maxReach >= nums.length - 1)return true;//可达最后位置
        }
        return true;
    }
}

这道题的核心就是一个最远可达位置变量的维护🤔🤔🤔

跳跃游戏II

LeetCode题目链接

这道题和上一道题相比就是这次不返回能否可达了,而是返回最小跳跃次数

请添加图片描述

我们来思路梳理

  • 这道题和上道题不同的是这道题的关键在于如何选择每一步的跳跃,使得每次都能跳到最远的地方,从而减少跳跃次数🤔🤔🤔

我们来进一步梳理贪心的四个子逻辑

  • 如何判断最优解

    • 最优解是能够到达最后一个位置的最少跳跃次数 ,每一步都尽可能跳到最远的位置,以减少总跳跃次数。每次跳跃后更新跳跃范围,直到能跳到最后一个位置为止🤔🤔🤔
  • 判断局部最优选择的可行性

    • 局部最优选择是在当前能够跳跃的范围内,找到可以跳到的最远位置。当到达当前跳跃范围的边界时,我们就进行一次跳跃,并更新下一步的跳跃范围。这样可以确保我们每次都选择最远的跳跃,从而减少跳跃次数🤔🤔🤔
  • 更新问题状态

    • 每次跳跃时,我们更新两个状态,一个是下一步的跳跃范围(也就是最远跳跃位置),另一个是跳跃的次数(每次跳跃完成则跳跃次数加1)🤔🤔🤔
  • 重复选择

    • 遍历数组,逐步更新能够跳跃的最远位置,每次达到当前跳跃范围的边界时进行跳跃,直到能够跳到或超过最后一个位置🤔🤔🤔
  • 我们在每一步的跳跃范围内,找到能够跳到的最远位置,一旦超出当前跳跃范围,就进行跳跃,并更新跳跃的范围。每次跳到最远位置时,跳跃次数加 1,直到能够到达或超过最后一个位置🤔🤔🤔

class Solution {
    public int jump(int[] nums) {
        int jump = 0;//初始化跳跃次数
        int maxReach = 0;//记录最远可达位置
        int endOfCurrentJump = 0;//记录当前跳跃范围的边界

        for(int i = 0; i < nums.length - 1; i++){//不需要遍历到最后一个数,能跳过去
            //判断局部最优选择的可信性
            maxReach = Math.max(maxReach, i + nums[i]);//更新最远可达位置

            //到达跳跃边界时进行跳跃
            if(i == endOfCurrentJump){
                jump++;
                endOfCurrentJump = maxReach;//更新下一次跳跃范围

                if(endOfCurrentJump >= nums.length - 1)break;
            }
        }
        return jump;
    }
}

总结

今天是继续学习贪心算法的第二天,大家一起加油✊✊✊

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

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

相关文章

Java入门-创建对象

Java包管理器 包&#xff08;package&#xff09;的导入 Java体系非常庞大&#xff0c;为了管理更多的代码互不侵犯&#xff0c;采用了一个叫“包管理”的机制来管理代码&#xff0c;简单来说就是把不同的Java代码放在不同的文件夹里&#xff0c;这个文件夹就是“包”。对于使…

【Linux】【命令】查找(grep/find)与统计(wc)

查找与统计 grepfindwcExamples grep grep 命令用于在文件中或者标准输出中搜索特定字符串&#xff0c;并显示匹配结果。 grep 全称&#xff1a;Global Regular Expression Print 基本语法&#xff1a; grep [OPTION]... PATTERN [FILE] ...默认情况下&#xff0c;PATTERN 是…

Agentic RAG(基于智能体的检索增强生成)是检索增强生成(Retrieval-Augmented Generation,RAG)技术的一种高级形式

Agentic RAG&#xff08;基于智能体的检索增强生成&#xff09;是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;技术的一种高级形式&#xff0c;它通过引入人工智能代理&#xff08;Agent&#xff09;的概念&#xff0c;为语言模型赋予了…

2024.10月18日- Vue2组件开发(3)

Vue组件开发 一、 ref属性 如果在vue里&#xff0c;想要获取DOM对象&#xff0c;并且不想使用JS的原生语法&#xff0c;那么就可以使用ref属性。ref属性的用法&#xff1a; 1&#xff09;在HTML元素的开始标记中&#xff0c;或者在Vue子组件中的开始标记中定义&#xff0c;相…

Pytest参数详解 — 基于命令行模式!

1、--collect-only 查看在给定的配置下哪些测试用例会被执行 2、-k 使用表达式来指定希望运行的测试用例。如果测试名是唯一的或者多个测试名的前缀或者后缀相同&#xff0c;可以使用表达式来快速定位&#xff0c;例如&#xff1a; 命令行-k参数.png 3、-m 标记&#xff08;…

jenkins添加新服务

jenkins添加新服务 新建item 添加流水线 node{def envname "ENVIRONMENT:1234-dev"def projectGitUrl http://xxxxx/xxxxxx/12345.gitdef imageServer harbor.xxxxx.com //镜像仓库地址def projectAppName 12345-applicationdef projectGitBranch dev//git分…

Android Camera2在textureView中的预览和拍照

Camera2预览和拍照 1、Camera2相机模型2、Camera2的重要类3、Camera2调用流程4、Camera2调用实现 1)定义TextureView作为预览界面2)设置相机参数3)开启相机4)开启相机预览5)实现PreviewCallback6)拍照 1、Camera2相机模型 解释上诉示意图&#xff0c;假如想要同时拍摄两张不同…

React高级Hook

useReducer useReducer 是 React 提供的一个 Hook&#xff0c;用于在函数组件中使用 reducer 函数来管理组件的 state。它类似于 Redux 中的 reducer&#xff0c;但仅用于组件内部的状态管理。useReducer 可以使复杂的状态逻辑更加清晰和可维护。 基本用法 useReducer 接收…

五金件 CNC 加工 —— 为您的产品增添价值

在现代制造业中&#xff0c;五金件作为各种产品的重要组成部分&#xff0c;其质量和精度直接影响着产品的性能和外观。而 CNC(Computer Numerical Control&#xff0c;计算机数控)加工技术的出现&#xff0c;为五金件的生产带来了革命性的变化。它以高精度、高效率和高稳定性的…

031 商品上架-增量同步和全量同步(cubemall-search模块)

文章目录 增量同步全量同步SpuInfoDao.xmlSpuInfo实体类application.ymlpom.xmlSpuInfoController.javaSpuInfoDao.javaSpuInfoEntity.javaSpuInfoRepository.javaSpuInfoServiceImpl.javaCubemallSearchApplication.java 增量同步 1.功能分析 前端页面&#xff0c;点击"…

LabVIEW智能螺杆空压机测试系统

基于LabVIEW软件开发的螺杆空压机测试系统利用虚拟仪器技术进行空压机的性能测试和监控。系统能够实现对螺杆空压机关键性能参数如压力、温度、流量、转速及功率的实时采集与分析&#xff0c;有效提高测试效率与准确性&#xff0c;同时减少人工操作&#xff0c;提升安全性。 项…

智能指针(3)

目录 可能问题五&#xff1a; 问题分析&#xff1a; 答案格式&#xff1a; shared_ptr的模拟实现 部分1&#xff1a;引用计数的设计(分考点1) 代码实现&#xff1a; 部分2&#xff1a;作为类所必须的部分(分考点2) 代码实现&#xff1a; 部分3&#xff1a;拷贝构造函数…

河北工业大学《2021年+2020年980自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《河北工业大学980自控考研资料》的真题篇&#xff0c;真题年份为2004-最新一年。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2021年真题 2020年真题 Part1&#xff1a;2021年…

Data+AI下的数据湖和湖仓一体发展史

DataAI下的数据湖和湖仓一体发展史 前言数据湖的“前世今生”AI时代的救星&#xff1a;湖仓一体湖仓一体实践演进未来趋势&#xff1a;智能化、实时化结语 前言 数据湖&#xff1f;湖仓一体&#xff1f;这是什么高科技新名词&#xff1f; 别急&#xff0c;我们慢慢聊。想象一…

DBeaver导出数据表结构和数据,导入到另一个环境数据库进行数据更新

在工作中&#xff0c;我们会进行不同环境之间数据库的数据更新&#xff0c;这里使用DBeaver导出新的数据表结构和数据&#xff0c;并执行脚本&#xff0c;覆盖另一个环境的数据库中对应数据表&#xff0c;完成数据表的更新。 一、导出 右键点击选中想要导出的数据表&#xff0…

parent参数

一、parent参数 parent参数除了有之前父窗口的界面效果外&#xff0c;还体现了Qt的内存管理策略。parent参数的对象是当前创建的对象的父对象。因此在Qt中存在父对象与子对象的概念&#xff0c;需要注意的是&#xff0c;此处的父子关系与继承无关&#xff0c;至于parent参数有关…

UNION 联合查询

1.UNION ALL联合查询 同样为了演示方便&#xff0c;先向 teacher 表插入多条测试数据&#xff1a; INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…

Web 应用防火墙(WAF)

在现代Web应用开发中&#xff0c;Nginx作为反向代理的架构被广泛采用。这种架构具备高性能、易扩展的特点&#xff0c;但也带来了Web层的安全挑战。Web应用防火墙&#xff08;WAF&#xff09;作为专门防御Web应用层攻击的安全措施&#xff0c;能够为此架构增加一层强有力的保护…

服务器托管的优缺点有哪些?

由于数字化程度不断提高&#xff0c;服务器在日常业务中发挥着越来越重要的作用。在大多数情况下&#xff0c;服务器由公司自己维护和管理。但对于一些公司来说&#xff0c;托管服务器(将这些任务交给专业人员)是更好的选择。 关于服务器的优缺点&#xff0c;有一点是明确的&am…

Centos7 安装升级最新版Redis7.4.1

1. 前言 今天阿里云云盾检测出一个redis低版本的漏洞,需要升级到稳定高版本修复漏洞,升级过程遇到了一些坑,特记录分享给大家,原服务器默认yum源安装的gcc 是4.8.5 ,默认安装redis是 3.2.12(如下图): 2.升级GCC 升级新版redis需要更高级的gcc支持,这里我们就选择升级…