给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
解1
从数组的尾部开始遍历数组,使用一个额外的数组记录每个元素跳跃到数组尾部需要的步数,返回该数组的第一个元素。
public static int jump(int[] nums) {
int temp[] = new int[nums.length];
temp[nums.length-1] = 0;
for(int i = nums.length-2;i>=0;i--) {
int gap = nums.length-i-1;
if(nums[i]>=gap) {
temp[i]=1;
}
else {
int min = temp[i+1];
int end = i+nums[i];
if (end >(nums.length-1)) //防止数组越界
end = nums.length-1;
for(int j=i+1;j<=end;j++) {
if(min>=temp[j])
min = temp[j];
}
temp[i]=min+1;
}
}
// System.out.println(Arrays.toString(temp));
return temp[0];
}
解2
贪心算法,使用end表示上一节点可以跳到的范围,使用maxPos表示可以跳到的最远距离,每次i==end时,steps++,表示需要多进行一次跳跃。
public static int jump(int[] nums) {
int end = 0;
int steps = 0;
int maxPos = 0;
for(int i = 0;i<nums.length-1;i++) {
maxPos = Math.max(i+nums[i], maxPos);
if(maxPos>=nums.length-1)
return steps+1;
if(end == i) {
steps++;
end = maxPos;
}
}
return steps;
}