原链接:https://leetcode-cn.com/leetbook/read/leetcamp-2/aag0zh/
题目:给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例一:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例二:
输入: nums = [2,3,0,1,4] 输出: 2
题解一:优化后的贪心算法
- 不断维护可达区间的右端点r



- 遍历每个位置,对于每个位置
i确定是几步可达:假设第i个位置可跳跃长度为ai,则区间[i+1,i+ai]均为x+1步可达,其中x为步数,下面的r是右端点。r<i+ai:区间[r+1,i+ai]为之前不可达,且现在可达的点。由于点i为能够到达该位置的第一个点,所以到达次新区间的最小步数为x+1,将其记录于步数数组中。r>=i+ai:不会有新区间产生/*** @param {number[]} nums* @return {number}*/var jump = function(nums) {const steps = [0];let r = 0;for(let i = 0;i<nums.length;i++){let nr = i + nums[i];if(nr < r){continue;}else{for(let j=r+1;j<nr+1;j++){steps.push(steps[i]+1);}r = nr;}}return steps[nums.length - 1];};
