LeetCode55 跳跃游戏

LeetCode55 跳跃游戏

四月打卡系列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1tcoYXwI-1587128439660)(C:\Users\11215\AppData\Roaming\Typora\typora-user-images\image-20200417202802742.png)]

题解

方法一:正推

能否达到最后的位置在于——前面存在某个位置X自己本身可以到达,并且可以跳到最后位置

那么如示例一所示:

nums[1],可以由nums[0]到达,并且nums[1]+1 >=nums.lenth-1

示例二:

nums[1],可以由nums[0]到达,但nums[1]+1 < nums.lenth-1

nums[2],可以由nums[1]到达,但nums[2]+2 < nums.lenth-1

同理其余均不可以到达最后位置

我们将可以跳到最后位置的这个值称作最大跳跃值,在循环时,要确保所选中的X是本身到达的。

class Solution {
    public boolean canJump(int[] nums) {
      int len = nums.length;
        int rightmax = 0;
        for (int i = 0; i < len; i++) {
            if (rightmax >= len - 1) {
                return true;
            }
            if (i <= rightmax) {
                rightmax = Math.max(rightmax, i + nums[i]);
            }
        }
        return false;
    }
}
方法二:反推

原理如上,只是反推

首先找到某个值nums[i]+i >= 跳到最后位置所耗距离的最小值len-1

然后只需要确定 i 这个位置是可以到达的就可以了

class Solution {
    public boolean canJump(int[] nums) {
        
        if (nums == null) {
            return false;
        }
        int temp = nums.length-1;
        for(int i=nums.length-2;i>=0;i--){
            if(temp<=nums[i]+i){
                temp=i;
            }
        }
        return temp==0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值