LeetCode刷题复盘笔记—一文搞懂贪心算法之45. 跳跃游戏 II问题(贪心算法系列第五篇)

news2024/10/7 10:21:21

今日主要总结一下可以使用贪心算法解决的一道题目,45. 跳跃游戏 II

题目:45. 跳跃游戏 II

Leetcode题目地址
题目描述:
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:
输入: nums = [2,3,0,1,4]
输出: 2

提示:

1 <= nums.length <= 10^4
0 <= nums[i] <= 1000

本题重难点

本题相对于55.跳跃游戏还是难了不少。

但思路是相似的,还是要看最大覆盖范围。

本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢?

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。

思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。

所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

如图:

在这里插入图片描述

图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)

从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。

C++代码

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int curDistance = 0;    // 当前覆盖最远距离下标
        int ans = 0;            // 记录走的最大步数
        int nextDistance = 0;   // 下一步覆盖最远距离下标
        for (int i = 0; i < nums.size(); i++) {
            nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) {                         // 遇到当前覆盖最远距离下标
                if (curDistance < nums.size() - 1) {       // 如果当前覆盖最远距离下标不是终点
                    ans++;                                  // 需要走下一步
                    curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                    if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环
                } else break;                               // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
            }
        }
        return ans;
    }
};

总结

相信大家可以发现,这道题目相当于55.跳跃游戏难了不止一点。

但代码又十分简单,贪心就是这么巧妙。

理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。欢迎大家关注本人公众号:编程复盘与思考随笔(关注后可以免费获得本人在csdn发布的资源源码)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文投稿指南——中文核心期刊推荐(铁路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Windows卸载与清除工具“ Geek 与 CCleaner ” (带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

什么是闭包,Python闭包

闭包&#xff0c;又称闭包函数或者闭合函数&#xff0c;其实和前面讲的嵌套函数类似&#xff0c;不同之处在于&#xff0c;闭包中外部函数返回的不是一个具体的值&#xff0c;而是一个函数。一般情况下&#xff0c;返回的函数会赋值给一个变量&#xff0c;这个变量可以在后面被…

剑指 Offer 第5天、第6天

目录 剑指 Offer 04. 二维数组中的查找 剑指 Offer 50. 第一个只出现一次的字符 剑指 Offer 11. 旋转数组的最小数字 剑指 Offer 32 - I. 从上到下打印二叉树 剑指 Offer 32 - II. 从上到下打印二叉树 II 剑指 Offer 32 - III. 从上到下打印二叉树 III 剑指 Offer 04. 二…

Java线程池应用实例

线程池的学习基本概念好处应用场景ThreadPoolExecutor实例理解&#xff1a;执行流程自定义线程池4大核心参数测试demo结论&#xff1a;ExecutorService常用方法思考获取ExecutorService代码示例ScheduleExecutorService常用获取方式如下ScheduledExecutorService常用方法如下:代…

Linux | 一文带你真正搞懂Linux中的权限问题

在Linux下你有多少权限呢❓一、权限的基本概念二、Linux上的用户分类2.1 超级用户与普通用户2.2 用户之间的切换2.3 文件访问者的分类2.4 用户与访问者之间的联系三、文件属性与访问权限3.1 Linux下的文件类型&#xff08;1&#xff09;文件的八种类型&#xff08;2&#xff09…

单机Eureka构建步骤

目录 一、Eureka基础知识 &#xff08;一&#xff09;什么是服务治理 &#xff08;二&#xff09;什么是服务注册 &#xff08;三&#xff09;Eureka两组件 二、单机Eureka构建步骤 &#xff08;一&#xff09;IDEA生成eurekaServer端服务注册中心 &#xff08;二&#…

JavaWeb好用的工具、快捷键以及简单语法

一、VSCode ! tab生成一组默认页面模板lorem tab自动的生成一段随机的单词列模式编辑&#xff0c;将光标放在某个位置&#xff0c;然后按住alt&#xff0c;通过鼠标左键点击&#xff0c;就能选中多个位置一起修改/添加div.类名 tab可以直接创建一个类名为自己设定的块级元素…

前端布局神器display:flex

Flexbox&#xff0c;一种CSS3的布局模式&#xff0c;也叫做弹性盒子模型&#xff0c;用来为盒装模型提供最大的灵活性。首先举一个栗子&#xff0c;之前我们是这样实现一个div盒子水平垂直居中的。在知道对象高宽的情况下&#xff0c;对居中元素绝对百分比定位&#xff0c;然后…

java多线程的使用

温故而知新 --- Java多线程1. 关键字1.1 并发与并行1.2 进程和线程2. Java 线程2.1 Java的主线程2.2 线程声明周期3. Java 线程三种实现1.1 Big Data -- Postgres3. Java 线程三种实现1.1 Big Data -- Postgres4. Awakening1.1 Big Data -- Postgres1. 关键字 1.1 并发与并行 …

【图卷积网络】02-谱域图卷积介绍(一)

注&#xff1a;本文为第2章谱域图卷积介绍视频笔记&#xff0c;仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾&#xff0c;经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限&#xff1a;无法处理图数据结构1.5 将卷积扩展…

Linux查看本机状况命令

1.ip addr 查看自己的网络地址&#xff0c;网卡等情况 ping:查看网络可用性 2.top 查看当前计算机的cpu运行状况 在top状态下按1&#xff0c;可以查看自己的cpu是几核的 &#xff08;下图中红框的值是空闲率&#xff0c;用100-空闲率就是CPU使用率&#xff0c;单位为%&…

sql调优相关

目录 1.调优步骤 2.小表驱动大表 3.order by 优化 4.group by优化 1.调优步骤 慢查询的开启并捕获explain慢SQL分析show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况SQL数据库服务器的参数调优 2.小表驱动大表 EXISTS SELECT ... FROM table WHERE EXISTS (su…

10. 好客租房-RocketMQ快速入门[非项目必需]

本章节主要是学习RocketMQ, 目标快速入门, 能够回答或解决以下问题:了解什么是RocketMQ了解RocketMQ的核心概念动手安装RocketMQ服务快速入门&#xff0c;掌握RocketMQ的api使用对producer、consumer进行详解了解RocketMQ的存储特点10.1 RocketMQ简介与安装10.1.1 核心概念速通…

分享143个ASP源码,总有一款适合您

ASP源码 分享143个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 143个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1Fd3_qaHDj2_BuslyFT8YVQ?pwdrjmi 提取码&#x…

数据库02_函数依赖,范式---软考高级系统架构师008

1.首先我们来看这个,给定一个X,能确定一个Y那么就说,X确定Y,或者Y依赖x,那么 比如y = x * x 就是x确定y,或者y依赖于x 2.然后再来看图,那么左边的部分函数依赖,就是,通过A和B能决定C,那么如果A只用给就能决定C,那么就是部分函数依赖. 3.然后再来看,可以看到,A可以决定B,那么…

文件(2)

1)指定一个目录&#xff0c;扫描这个目录&#xff0c;找到当前目录下面所有文件的文件名是否包含了指定字符的文件&#xff0c;并提示这个用户是否要删除这个文件&#xff0c;根据用户的输入来决定是否删除&#xff1b; 1.1)需要进行输入一个目录&#xff0c;还需要进行输入一个…

概论_第7章_参数估计

参数估计的形式有两种&#xff1a; 点估计和区间估计 1 点估计 设x1,x2,...xnx_1, x_2, ... x_nx1​,x2​,...xn​是来自总体的一个样本&#xff0c; 我们用一个统计量 θ^\hat\thetaθ^ θ^(x1,x2,...,xn)\hat\theta(x_1, x_2, ..., x_n)θ^(x1​,x2​,...,xn​)的取值作为…

[ 云原生 | 容器 ] 虚拟化技术之容器与 Docker 概述

在云计算中&#xff0c;虚拟化技术一般可以被分为两类&#xff0c;分别是虚拟机&#xff08;VM&#xff0c;Virtual Machine&#xff09;技术以及容器&#xff08;Container&#xff09;技术&#xff0c;这里我们只讲云原生中 Docker 虚拟化技术。 文章目录一、应用部署方式的变…

Kubernetes:基于命名行终端/ Web 控制台的管理工具 kubebox

写在前面 kubebox 是一个轻量的 k8s 管理工具&#xff0c;可以基于命令行终端或 Web 端博文内容涉及&#xff1a;kubebox 不同方式的安装下载&#xff0c;简单使用。如果希望轻量一点&#xff0c;个人很推荐这个工具&#xff0c;轻量&#xff0c;而且使用简单。理解不足小伙伴帮…