当前位置:   article > 正文

贪心算法---跳跃游戏(2)

贪心算法---跳跃游戏(2)

题目:

给定一个长度为 n0 索引整数数组 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. public int jump(int[] nums) {
  2. if(nums.length==1) return 0;//数组只有一个元素,不用跳跃
  3. int curDistance=0;//当前覆盖的最远距离下标
  4. int ans=0;//记录走的步数
  5. int nextDistance=0;//下一步覆盖最远距离下标
  6. for(int i=0;i<nums.length;i++){
  7. nextDistance=Math.max(nums[i]+i,nextDistance);//更新下一步覆盖最远距离下标
  8. if(i==curDistance){//遇到当前覆盖最远距离下标
  9. ans++;//需要走下一步
  10. curDistance=nextDistance;//更新当前覆盖的最远距离下标
  11. if(nextDistance>=nums.length-1) break;//当前覆盖范围包含终点,直接结束
  12. }
  13. }
  14. return ans;
  15. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1021668
推荐阅读
相关标签
  

闽ICP备14008679号