给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
最先想到的就是这个,一个一个的来。
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 0) return false ;
boolean[] ans = new boolean[nums.length];
for(int i = 0 ; i < ans.length ; i ++){
ans[i] = false ;
}
if(nums[0] == 0 && nums.length != 1){return false;}
ans[0] = true ;
for(int i = 0 ; i < nums.length ; i ++){
int j = i ;
while(nums[i] != 0 && ans[j] == true && j <nums.length-1){
ans[j+1] = true ;
nums[i]--;
j++;
}
}
return ans[ans.length-1];
}
}
时间复杂度和空间复杂度都很高。
看了看人家的解法。
class Solution {
public boolean canJump(int[] nums) {
int n = 1 ;//第i个数到最后需要的长度
for(int i = nums.length-2; i >=0 ; i --){
if(nums[i] >= n){
n = 1 ;
}else{
n++ ;
}
if(i==0&&n>1){
return false;
}
}
return true ;
}
}
很妙,从后往前遍历,直到最后,i==0的时候,还是没有能够达到。速率很开。