跳跃游戏 II (贪心, 动态规划)

  • 题目描述(力扣45题) :

    • 给定一个长度为 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]

  

  • 解题思路:

    • 以[2, 3, 1, 1, 4] 为例
    • 首先从 0 索引位置出发,  可以跳到 1, 2 索引
    •  
    •  1 索引的 3 刚好可以到达最后一个位置的4, 二 2 索引的1 只能到达 3 索引的 1, 所以选择从 1 索引的 3 跳跃, 一共跳两次, 返回 2
  • 简单来说, 就是在本次的跳跃范围以内, 找出下次跳跃距离最远的那一个索引(位置).

  • 解题步骤: 

  • int length = nums.length; 获取数组的长度,用于控制循环范围。

  • int end = 0; 这个变量记录了当前跳跃的范围的最远位置。

  • int maxPosition = 0; 这个变量记录了当前跳跃范围内能够到达的最远位置。

  • int steps = 0; 这个变量记录了跳跃的步数。

  • for (int i = 0; i < length - 1; i++) {这是一个循环,从数组的第一个位置开始,遍历到倒数第二个位置。因为在循环中会访问 nums[i+1],所以循环的终止条件是 i < length - 1

  • maxPosition = Math.max(maxPosition, i + nums[i]);更新当前跳跃范围内能够到达的最远位置。i + nums[i] 表示从当前位置能够跳跃到的最远位置,通过 Math.max 来更新 maxPosition

  • if (i == end) {如果当前位置 i 达到了之前记录的跳跃范围的最远位置 end,说明需要进行下一次跳跃了。

  • 以下是代码实现: 

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

       

    •                                     以上是本篇文章的全部内容, 感谢观看

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值