题目
https://leetcode-cn.com/problems/jump-game/
分析
遍历每个位置x,如果x可达,更新最远可达max为max+nums[x]。
遍历过程中,如果最远可达大于等于最后一个位置,返回true。
代码
class Solution {
public boolean canJump(int[] nums) {
if(nums==null||nums.length==0||nums.length==1)
return true;
int max=nums[0];
for(int i=1;i<nums.length;i++){
//可达的
if(i<=max){
max=Math.max(max,i+nums[i]);
if(max>=nums.length-1){
return true;
}
}
}
return false;
}
}
复杂度
时间复杂度:O(n),其中n 为数组的大小。只需要访问 nums 数组一遍,共 n 个位置。
空间复杂度:O(1),不需要额外的空间开销。
结果
暴力超时
class Solution {
public boolean canJump(int[] nums) {
for(int i=0;i<=nums[0];i++){
boolean b=can(nums,0,i);
if(b){
return true;
}
}
return false;
}
//从index出发走step步是否成功
public boolean can(int[] nums,int index,int step){
if(index==nums.length-1){//到终点了,成功
return true;
}
if(step==0){//跳不动了
return false;
}
int next=index+step;
for(int i=0;i<=nums[next];i++){
if(can(nums,next,i)){
return true;
}
}
return false;
}
}