给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 104;
0 <= nums[i] <= 1000;
找规律真难,start记录当前的能达到的最远距离和end记录下一步能达到的最远距离,从零开始,一开始start=nums[0] ,1到start的区间内步数肯定为1,end记录当前位置所能到达的最远距离end=i+nums[ i ],end取最大值,这样会发现(start,end ]的步数就是2,以此…返回最后的步数大小即可。。
最好自己写一个长度稍微小一点的,手动计算一下,会更好的理解
代码如下:
class Solution {
public int jump(int[] nums) {
if(nums.length==1) return 0;
int i=1;
int start=nums[0];
int end=0;
int steps=1;
while(i<nums.length){
if(i>start){
steps++;
start=end;
}
if(i+nums[i]>end)end=i+nums[i];
i++;
}
return steps;
}
}