45. 跳跃游戏 II (贪心)

题目链接:力扣

解题思路:贪心,尽可能地找到下一跳能够跳到的最远距离,这样到达终点时,所需跳跃次数最少

以nums = [2,3,1,1,4,2]为例:

  1. 以当前位置begin作为起跳点,能够跳跃的最远距离为m,那么接下来的m个位置都能作为下一次的起跳点。从这m个位置中选择能够跳远最远的点最为下一次起跳点。result保存最终跳跃次数
    1. 初始时在位置0,num[0]=2,那么接下来的2个位置,都能作为下一次的起跳点 [2,3,1,1,4,2],可以选择3和1,选择3能够跳跃的最远索引为4,选择1能够跳跃的最远索引为3,显然选择3能够跳跃最远,即选择索引为1的位置作为下一跳的起跳点
  2. 从上次选择的起跳点作为新的begin,重复步骤1,直到能够跳跃到最后,每次跳跃时result自增1
    1. 上一次的起跳点的索引为1,num[1]=3,接下来的3个位置都能作为下一次跳跃的起跳点。[2,3,1,1,4,2],显然选择4,即从索引为4的位置开始跳能够跳的最远,当选择从索引为4的位置跳时,能够跳跃的最后,结束,result即所求。
    2. 一个小优化:其实可以不用从上一次选择的起跳点的下一个位置作为本次起跳点的开始位置,而是直接将上一次起跳范围的结束位置作为本次起跳点的开始位置:
      1. 上一次的起跳点选择范围为:[2,3,1,1,4,2],本次起跳的范围[2,3,1,1,4,2]
      2. 其中本次起跳的范围可以直接为:[2,3,1,1,4,2],即将上一次跳跃的最远距离end作为下一次起跳的开始位置begin。而不用上一次选择的起跳点的下一个位置作为begin,这样可以减少选择起跳点的循环次数
      3. 比如上一次的起跳范围为: [begin1,a1,a2,a3,end1],假如选择a1作为起跳点能够跳跃的最远距离为m,则下一跳的跳跃范围为[begin1,a1,a2,a3,end1,b1,b2,...,m],仔细观察,可以发现a2,a2,end1这三个位置在本次跳跃中的位置选择可以不用考虑,因为从这些位置出发,能够跳跃的最远位置肯定小于m(因为选择a2此能够跳跃最远m,其他位置能够跳跃的距离都比m小),所以本次跳跃的范围只需要从[begin1,a1,a2,a3,end1,b1,b2,...,m],这些位置中选择就可以了。
  3. 解题的关键在于:下一跳的起跳点的选择,当前位置begin能够跳跃的最远距离为m,则begin后面的m个位置都能够最后下一次的起跳点,从这m个位置中选择能够跳跃最远的位置作为新的起跳点。其中可以使用begin,end保存下一跳能够选择的起跳点,end=begin+m,下一条的起跳点范围为(begin,end],左开右闭区间。
    1. 选择每次起跳点时可以使用for选择,从(begin,end]区间进行选择
    2. 每完成一次跳跃,更新begin和end,并令result+1
    3. 当下一跳能够跳跃的最远距离大于等于nums.length-1,算法结束

AC代码:

class Solution {public static int jump(int[] nums) {int result = 0;//下一跳的选择区间[begin,end],左闭右闭区间//能够选择的跳跃区间的左边界int begin = 0;//能够选择的跳跃区间的右边界int end = 0;while (end < nums.length - 1) {int nextEnd = 0;for (int i = begin; i <= end; i++) {//从[begin,end]区间中计算能够跳跃的最远位置,并更新左边界nextEnd = Math.max(nextEnd,i+nums[i]);}//下一次能够选择的起跳点的开始位置begin = end+1;//下一次能够选择的起跳点的结束位置end= nextEnd;result++;}return result;}
}

 优化

在上述while循环包含的for循环中,begin和end的更新都是从前往后更新的,可以优化掉外层的循环,只需要在完成一次跳跃时更新下一次能够跳跃的最远距离,使用一个for循环从前往后遍历:

  1. 初始时,最小跳跃次数result=0,end=0,nextEnd=0;
  2. 每遍历一个位置更新一次能够跳跃的最远距离nextEnd=Math.max(nextEnd,i+nums[i])。
  3. 当i==end时,说明上一次的跳跃的边界结束了,开始下一次跳跃点的选择,这个时候更新end=nextEnd,result++

AC代码

class Solution {public static int jump(int[] nums) {int result = 0;int end = 0;int nextEnd = 0;for (int i = 0; i < nums.length - 1; i++) {nextEnd = Math.max(nextEnd, i + nums[i]);if (i == end) {end = nextEnd;result++;}}return result;}
}

上面两种算法的时间复杂度都是O(n),效率一样。不过后面这种算法做法更加简洁

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

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

相关文章

B067-基础环境-抽取Basegit

目录 抽取base抽取domain和querymapper接口抽取service抽取 Git优点&#xff1a;Git安装及操作Git Bash命令行操作图形化客户端TortoiseGit操作Git集成Idea操作idea会把workspace作为本地仓库gitee操作idea解决代码冲突 抽取base 抽取domain和query domain&#xff1a;所有实体…

抖音seo矩阵源码*开发搭建*代码打包部署(开源)分享

1一、 抖音seo矩阵源码开发搭建&#xff08;支持二开&#xff09;概述 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号…

Oracle-奇怪的expdp备份报错LPX-00217

问题背景: 接用户报障&#xff0c;数据库每天晚上正常的expdp备份&#xff0c;从2天前开始出现奇怪的备份报错LPX-00217: invalid character 3 问题分析: 检查expdp备份的日志&#xff0c;从2天前晚上开始的备份均出现LPX-00217: invalid character 3的报错&#xff0c;报错均…

两个好用到爆的Python模块,建议收藏!

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

如何修复ssh漏洞进行版本升级

目录 一、ssh低版本漏洞信息 OpenSSH GSSAPI 处理远端代码执行漏洞 OpenSSH GSSAPI认证终止信息泄露漏洞 OpenSSH X连接会话劫持漏洞 二、升级ssh版本进行修复漏洞 第一步 安装Telnet服务 第二步 重启服务 第三步 安装依赖环境 第四步 备份ssh老版本文件 第五步 导入…

【动态规划上分复盘】下降路径最小和|礼物的最大价值

欢迎 前言一、动态规划五部曲二、下降路径最小和思路&#xff1a;动态规划解法具体代码如下 三、礼物的最大价值思路&#xff1a;动态规划具体代码如下: 总结 前言 本文主要讲述动态规划思路的下降路径最小和以及礼物的最大价值两道题。 一、动态规划五部曲 1.确定状态表示&a…

python_day3_str

字符串str 按索引下标查找 str Hi, world, follow, admin print(str[0]) print(str[-1])index() str Hi, world, follow, admin print(str.index(world)) #首字母下标 print(str.index(w))字符串.replace&#xff08;字符串1&#xff0c;字符串2&#xff09;&#xff1a;…

【Elasticsearch】初识elasticsearch

目录 初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术&#xff1f; 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档…

数分面试题:赛马问题

问题一&#xff1a; 25匹马&#xff0c;一个赛道&#xff0c;每次可以跑5匹马&#xff0c;在没有计时器的情况下&#xff0c;怎么用最小的比赛次数知道最快的前三名 关键点&#xff1a;通过前面的比赛&#xff0c;排除掉没有悬念的马&#xff08;能确定有3匹马比它快的&#…

Android studio 引入不了R包,手动引入显示红色。可以跑起来却没问题

之前在这个问题踩坑2次&#xff0c;遂记录一下。 问题是&#xff1a;工程里找不到自己包名的R&#xff0c;手动导入显示红色&#xff0c;Run起来倒是没问题 尝试过Clean&#xff0c;Rebuild&#xff0c;清缓存&#xff0c;重启&#xff0c;都没用。 最终发现是没有在 Android…

【Web3】MetaMask钱包配置

目录 主网更换测试网 私钥如何登录钱包 主网更换测试网 私钥如何登录钱包

【WebGIS初学到入职】(15)入职一年的总结与分享

题外话 看看大纲可以怎么写&#xff0c;问问ChatGPT&#xff1a; ……算了&#xff0c;还是随便写写吧。 所以时间过得也是有够快的&#xff0c;这就一年了。 平淡 入职一年&#xff0c;已经看到好些位女同事结婚了&#xff08;男同事一个没有&#xff09;。领导和同事都挺…