提交了好几次,finally!
题目是这样的:
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4]
, return true
.
A = [3,2,1,0,4]
, return false
.
给一个一维数组,一开始在0位置,下标所对应的的值代表你可以跳的最大格数,问能不能跳到终点。
刚看到此题很自然想到:对于每个下标,分别跳1~nums[i]次,递归往前推进,如果下标值为0的话,则返回上一层。跳到大于等于终点则成功。
boolean jumping(int[] nums,int start,boolean flag){
if(nums[start]+start>=nums.length-1){
return flag=true;
}else if(nums[start]==0){
return flag;
}else{
for(int i=start+1;i<start+1+nums[start];i++){
jumping(nums,i,flag);
}
}
return flag;
}
大体上是这样的,然而最后提交失败,有个[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,....................]这样的没过。
后来又想,每次只跳一次太慢,不如每次跳最大距离,如果跳到的位置的值为0的话,就往前退一步。这样有可能循环跳前跳去,大概要再置个flag,标记一下之前是否是从这里出发的,很麻烦 最后也没有提交成功,遇到刚才那个例子又炸了。
最后想想,还是回归一下本质吧,因为那个例子全是1, 但只有是0的情况下才跳不了。
于是一开始置n为nums[0],每跳一步,n减一,再与n与nums[i]比, 取n等于大的那个。遇到0,则判断n是否大于1,是的话则可以跳回去。否则就没力气跳不动了,返回false。
代码如下:
public class Solution {
public boolean canJump(int[] nums) {
int n=nums[0];
if(n==0&&nums.length>1){
return false;
}
for(int i=1;i<nums.length-1;i++){
if(nums[i]==0){
if(n<2){
return false;
}
}
n--;
n=n>nums[i]?n:nums[i];
}
return true;
}
}