大纲

给定一个非负数的数组,获取跳到数组最后位置的最少次数

示例

  1. nums = [2,3,1,1,4]
  2. 2
  3. 跳到最后一个位置的最小跳跃数是 2
  4. 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置

思路

  1. 在跳跃距离内,记录每次跳跃时可获得的最远距离
  2. 记录每次最长跳跃时,次数加一次,判定的下标重新赋值成最远距离
  3. 每次遍历判断当前的下标是否与上次增加次数时的下标相同,如果相同,就执行2
  4. 只遍历到数组的最后第二个位置,不然跳跃的次数会多一次

    解释

    ```javascript nums = [2, 3, 1, 1, 4]

// 第一次遍历 // 下标为0,跳跃距离为2 distance = 0 + 2 // 第一次跳跃时,记录下结束的位置 endIndex = 2; // 跳跃次数加1 step = 1

// 第二次遍历 // 下标为1,跳跃距离为3 // 当前跳跃距离比上次记录的2要大,所以取最大跳跃距离4 distance = 1 + 3

// 第三次遍历 // 下标为2,跳跃距离为1 // distance = 2 + 1 // 但是此次跳跃距离还是小于上次跳跃距离,所以distance还是4 // endIndex已经来到了需要判断的时候 if (endIndex === i) { endIndex = 4 step += 1 }

// 此时跳跃距离已经达到了数组长度,可以直接退出遍历

  1. <a name="UE25K"></a>
  2. ### 实现
  3. ```javascript
  4. var jump = function(nums) {
  5. let endIndex = distance = step = 0;
  6. const len = nums.length;
  7. for (let i = 0; i < len - 1; i++) {
  8. distance = Math.max(distance, nums[i] + i);
  9. if (endIndex === i) {
  10. endIndex = distance;
  11. step++;
  12. }
  13. if (endIndex >= len) {
  14. break;
  15. }
  16. }
  17. return step;
  18. };