55. Jump Game解题报告

提交了好几次,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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值