1.跳跃游戏
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;
}
}
2.跳跃游戏 II
本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖到了终点,这个范围内最小步数一定可以跳到,不管具体是怎么跳的,不必纠结一步究竟跳一个单位还是两个单位。
class Solution {
public int jump(int[] nums) {
if(nums.length==0||nums.length==1){
return 0;
}
//记录跳跃的次数
int count = 0;
//当前覆盖的最大区域
int curCover = 0;
//最大覆盖的最大区域
int maxCover = 0;
for(int i = 0;i<nums.length;i++){
//在可覆盖区域的内更新最大区域的覆盖范围
maxCover = Math.max(maxCover,i+nums[i]);
//说明当前一部,再跳一部就到达了末尾
if(maxCover>=nums.length-1){
count++;
break;
}
//当走到当前覆盖的最大区域时,更新
if(i==curCover){
curCover=maxCover;
count++;
}
}
return count;
}
}