跳跃游戏I

55. 跳跃游戏 45. 跳跃游戏 II_最优解

分析

每移动一个单位就更新最大覆盖范围,如果最大覆盖范围大于等于最后一个下标则返回true,否则返回false。

局部最优解:每次取最大跳跃步数(取最大覆盖范围)。

整体最优解:最后得到整体最大覆盖范围,看是否能到终点。

55. 跳跃游戏 45. 跳跃游戏 II_算法_02

代码

class Solution {
public boolean canJump(int[] nums) {
//覆盖范围
int cover = 0;
for(int i = 0;i <= cover;i++){
cover = Math.max(cover,i + nums[i]);
if(cover >= nums.length - 1) return true;
}
return false;
}
}

55. 跳跃游戏 45. 跳跃游戏 II_最优解_03

跳跃游戏 II

55. 跳跃游戏 45. 跳跃游戏 II_leetcode_04

分析

55. 跳跃游戏 45. 跳跃游戏 II_Math_05

移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时:

1.如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
2.如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。

关键点:
以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点

代码

class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return 0;
}
//当前覆盖最远距离下标
int cur = 0;
//下一步覆盖最远距离下标
int next = 0;
int l = 0;
for(int i = 0;i < nums.length;i++){
next = Math.max(next,i+nums[i]);

if(next >= nums.length-1){
l++;
break;
}
if(cur == i){
l++;
cur = next;
}


}
return l;

}
}

55. 跳跃游戏 45. 跳跃游戏 II_Math_06