题目描述给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
思路:
普通版的跳跃问题,只需要求出是否可达。这道题默认可达 只需要找出来最小跳跃。
普通跳跃问题先计算每个位置元素最远可达的位置 然后每次跳跃至最远距离。假设起始点A,A可以跳到A+1~B-1,A最远可达B-1,那么就跳到B-1.B-1的选择同A.
进阶版的跳跃问题:需要找到跳跃最少次数。所以假设起始点A A的第一个不可达点是B,就是A最远只能跳到B-1,那么A+1~B-1势必要有一次跳跃。这里就需要选择出A+1 ~B-1中,可以跳到最远的点。
public int jump(int[] nums) {
if(nums.length<=1){
return 0;
}
int cur_length=nums[0];//当前节点最远可达
int pre_length=nums[0];//每个节点最远可达
int jump=1;
for(int i=1;i<nums.length;i++){
if(i>cur_length){
cur_length=pre_length;
jump++;
}
if(nums[i]+i>pre_length){
pre_length=nums[i]+i;
}
}
return jump;
}
}