其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
局部最优:每次取最大跳跃步数(取最大覆盖范围)
整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public boolean canJump(int[] nums) {
int coverrange = 0;
if(nums.length==1){
return true;
}
//i表示覆盖范围内可以跳跃的索引下标
for(int i=0;i<=coverrange;i++){
coverrange = Math.max(coverrange, i+nums[i]);
if (coverrange>=nums.length-1){
return true;
}
}
return false;
}
}
时间复杂度:O(n),其中 n为数组的大小。只需要访问 nums 数组一遍,共 n个位置。
空间复杂度:O(1),不需要额外的空间开销。