LeetCode 45. 跳跃游戏 II

news2024/11/16 10:40:09

45. 跳跃游戏 II - 力扣(LeetCode)

解法1:(动态规划 + 贪心)

果然代码越短,思路越难。这题用的是动态规划+贪心的思想。首先分析题意我们可以知道,从索引0这个点开始,我们走一步可以到达一些点,最远可以到达的点自然就是0 + nums[0],所以能从0走一步到达的点是不止一个的,它们组成了一个组,下标范围是1 ~ 0 + nums[0],这些下标到达所需的最少步数就是1,这就形成了局部最优,之后我们如法炮制,再去找走两步可以到达哪些点,找之前,我们首先应该明确一下,为什么这样做是对的?会不会存在我们接下来求出的那些最少走两步可以到达的点,它们实际上还有更优的解呢?比如走一步就能到呢?答案是否定的。如果这个点走一步就能到达,我们知道,肯定是从下标0开始走,走一步到达的。但是我们对于下标0求出了一个走一步所能到达的范围,也就是0 + nums[0],如果下标范围没在这个里面,那是肯定走一步是没法到达的,其实不单单走一步能到走两步能到这个例子,后面同样也是如此分析的,这也是一种单调性,我们随着下标越来越大,每个下标对应的最少能到达的步数是只会递增的,这点是很关键的,所以我们可以用动态规划的思想,用前一个状态去更新后一个状态,因为我们知道,走两步可以到达的点,肯定是从那些走一步可以到达的点当中某一个点走一步到达的,所以我们就可以用那些走一步可以达到的的点,去更新出走两步可以到达的店(注意,我说的这些修饰词:走一步、走两步啥的,都是相对于起点,也就下标0而言的)。寻找走两步可以到达的点,肯定是从走一步可到达的点组的右边界的下一个点开始,也就是0 + nums[0] + 1,从这个点开始,我们用双指针思想,第二个指针从走一步的点组的左边界开始枚举,去找走一步的点组中第一个可以走一步到达0 + nums[0] + 1这个下标的点,然后将这个点的值更新为走两步(也就是2),这里可能会有疑问?为什么非要找走一步的点组中的第一个呢?这个其实也不是,理论上单单对于求0 + nums[0] + 1这个下标的最少步数,我们是无所谓的,无论从走一步点组中的哪一点走,反正都是走一步可以到这个点,0 + nums[0] + 1这个下标的最少步数肯定是被更新成2,不管是从哪个点走过来的。但是我们从走一步点组中的点从左边界到右边界枚举,也是有一个目的:确保最优,如果存在更优解会覆盖之前不那么优秀的解。而且枚举每个走一步的点组,因为它们的下标不同嘛,nums[i]也不同,所以每一个点走一步所能到达最远的点都是不一样的。所以用走一步点组的中的这些点去更新出来的点,也是一个点组,这个点组也就是走两步点组了。并且我们保证了走两步点组中的所有点,它们都是最少的步数,它们之中都不存在,明明一步能到的,我们给他更新成了两步(这个之前也分析了),同样也不存在的是,这个走两步点组的右边界的下一个点一定是需要走三步才能到的,也就是说我们把走两步点组的下标范围,也是更新成了最大的范围,不能再大了。所以这样就保证了我们解的最优性。这也是贪心的思想,每一个当前最优的状态的,是从上一个最优的状态更新过来的,上一个是最优状态,再走一步到达的这个点,肯定也是最优状态,这也就是这题动态规划+贪心的魅力所在吧。

当然,我这是文字通俗解释,会特别冗长多余,需要简洁解释的小伙伴可以参考:

LeetCode 45. 跳跃游戏 II - AcWing

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();

        vector<int> f(n);

        for(int i = 1, j = 0;i < n; i ++ ) { 
            while( j + nums[j] < i) j ++ ;
            f[i] = f[j] + 1;
        }

        return f[n -1];
    }
};

解法2 : (贪心 + 双指针)

在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {
        //贪心 + 双指针
        int n = nums.size();
        //维护三个指针,cur表示当前位置,dis表示目前可到达的最远位置,next表示每次枚举途中可以到达的最远位置
        int ans = 0, cur = 0, dis = 0;
        while(dis < n - 1) { 
            //next是每一轮枚举的临时变量,定义在里面的
            int next = 0;
            while(cur <= dis) {
                next = max(next,cur + nums[cur]);
                cur ++;
            }
            ans ++;
            dis = next;
        }
        return ans;
    }
};

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

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

相关文章

redis命令第二弹

1、redis命令-hash类型练习2、redis命令-list类型练习3、redis命令-set类型练习

YOLOV5环境搭建以及训练COCO128数据集

前言记录了自己训练coco128的全过程手把手教你YOLOV5环境搭建以及训练COCO128数据集。相关配置文件在百度网盘中。如果懒得话可以直接全部用我的数据一、准备工作1.1创建环境打开anaconda power shell&#xff08;最好以管理员身份运行&#xff0c;免得到后面相关文件权限进不去…

sentinel-介绍(一)

Sentinel Website&#xff08;Sentinel 官网网站&#xff09; Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系…

ansible配置yum源仓库

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 仓库 2: Name: RH294_S…

LeetCode刷题模版:41 - 50

目录 简介41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标…

axios系列之取消请求

文章の目录写在最后使用 cancel token 取消请求 Axios 的 cancel token API 基于cancelable promises proposal&#xff0c;它还处于第一阶段。 可以使用 CancelToken.source 工厂方法创建 cancel token&#xff0c;像这样&#xff1a; const CancelToken axios.CancelToken;…

Revit二次开发小技巧(十七)实时监控模型线的生成

前言&#xff1a;项目中需要一个需求&#xff0c;用户想调用出Revit中自带的绘制模型线方法&#xff0c;然后再绘制结束时&#xff0c;可以拿到绘制的模型线&#xff0c;然后实现后面的算法。这里记录一种方法&#xff0c;通过DocumentChange事件修改Tag的PropertyChanged事件来…

【Python】pandas获取全省人口数据并作可视化分析

前言 今天我们看看自己所在的省份的人口人数&#xff0c;使用pandas并作可视化分析。 环境使用 python 3.9pycharm 模块使用 pandasPandas 是基于NumPy的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供…

java和vue募捐网水滴筹项目捐款爱心系统筹款系统

简介 募捐网&#xff0c;注册用户实名认证通过后可以发布募捐&#xff0c;管理员审核募捐通过后&#xff0c;前台用户可以看到该募捐信息&#xff0c;进行募捐或者举报&#xff08;管理审核举报成功后&#xff0c;会拉黑该募捐发起人&#xff09;&#xff0c;前台展示公告、爱…

83. 删除排序链表中的重复元素(链表)

文章目录题目描述方法一 暴力法方法二 递归法参考文献题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2…

酷开系统——家庭场景下的智能营销系统!

随着人们生活方式的改变&#xff0c;以往传统的营销资源和渠道正在慢慢陷入一个“无用”的尴尬境地&#xff0c;而作为家庭娱乐中心的智能大屏&#xff0c;近两年所表现出来的数据和效果却逐渐备受企业和品牌方关注&#xff0c;有数据显示&#xff0c;智能大屏的家庭覆盖规模正…

bug 站在一个测试的角度看bug

如何描述一个bug ?如何定义bug的级别 ?bug的生命周期 ?如何开始第一次测试 ?测试的执行和bug管理 ?产生争执怎么办 ?如何描述一个bug?作为一名测试人员&#xff0c;提bug是最基础的工作&#xff0c;那我们如何才能把bug提的清晰易懂呢?发现问题的版本 开发人员获取对应…

k8s之基于kubeadm搭建k8s集群

写在前面 你可能知道搭建k8s集群的kind&#xff0c;minikube工具&#xff0c;但是他们都太简单了&#xff0c;不能满足生产级的要求&#xff0c;想要真正的部署生产级别的k8s集群&#xff0c;我们还需要另外一个集群管理工具kubeadm ,本文就一起看下如何使用该工具来搭建k8s集…

STM32MP157驱动开发——Linux下的单总线驱动

STM32MP157驱动开发——Linux下的单总线驱动0.前言一、DS18B20 及工作时序简介1.DS18B20 简介2.DS18B20 时序简介4.DS18B20温度读取流程二、DHT11 及工作时序简介1.DHT11 简介2.DHT11 工作时序简介三、驱动开发1.DS18B20驱动1&#xff09;修改设备树2&#xff09;驱动编写2.测试…

IB生物:干细胞与生命的各种功能

国际学校生物老师解读IB生物&#xff0c;感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物&#xff0c;分子生物&#xff0c;遗传学&#xff0c;生态学&#xff0c;物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

Python入门基础实例讲解——两个数字比大小,并输出最大值

嗨害大家好鸭&#xff01; 我是小熊猫~ 今天也是给大家带来干货的一天~ pycharm永久激活码可以从这里找到我&#xff1a; 输出&#xff1a;print&#xff08;&#xff09; print() 方法用于打印输出&#xff0c;最常见的一个函数。 比较运算符 >&#xff1a; 大于&#…

关于校园网的各种连接问题

校园网网络使用异常&#xff0c;掉线、卡顿以及无法连接网络&#xff0c;经网络上收据的信息&#xff0c;大致分为五类&#xff1a;1.能获取到校园网地址如10.*.*.*&#xff0c;但无法跳出认证界面。2.物理链路故障&#xff1b;3.IP配置故障&#xff1b;4. 网络正常&#xff0c…

SpringCloud高级应用-1(SpringCloud技术栈概览)

1、SpringCloud技术栈 开发分布式系统可能具有挑战性&#xff0c;复杂性已从应用程序层转移到网络层&#xff0c;并要求服务之间进行更多的交互。将代码设为“cloud-native”就需要解决12-factor&#xff0c;例如外部配置&#xff0c;服务无状态&#xff0c;日志记录以及连接…

【矩阵论】8. 常用矩阵总结——单阵,正规阵,幂0阵,幂等阵,循环阵

矩阵论 1. 准备知识——复数域上矩阵,Hermite变换) 1.准备知识——复数域上的内积域正交阵 1.准备知识——Hermite阵&#xff0c;二次型&#xff0c;矩阵合同&#xff0c;正定阵&#xff0c;幂0阵&#xff0c;幂等阵&#xff0c;矩阵的秩 2. 矩阵分解——SVD准备知识——奇异值…

基于Promethus+Grafana搭建监控系统

简介 ● 监测数据类型&#xff1a;JVM数据、在线人数、消息时延等 ● 接入Prometheus性能监测工具&#xff0c;暴露服务器性能监测数据 ○ 模式&#xff1a;pull/push ● 接入Grafana可视化数据 搭建流程 准备环境 Java客户端配置 <!-- The client --> <depende…