力扣55-跳跃游戏(java详细题解)

题目链接:55. 跳跃游戏 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。

贪心方法:局部最优推出全局最优。

如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。

题目思路:

该题也不好入手,我们会纠结第一步跳哪,第二步跳哪,最终能不能跳到终点。

如果纠结某一步跳什么地方的话,那么这个题就很难想出来了。

其实我们可以换一个维度,我们直接找覆盖范围,遍历每一个元素,尽可能的去增加他的覆盖范围,只要覆盖范围能大于等于终点,就直接返回true。

局部最优:遍历每一个元素时,尽可能的增大覆盖范围

全局最优,达到最大覆盖范围

我们不用纠结怎么跳,只要能达到终点即可。

具体的代码细节我在代码部分讲。

最终代码:

class Solution {
    public boolean canJump(int[] nums) {
        //定义range变量表示范围
        int range = 0;
        //如果只有一个元素,肯定是可以跳到终点的
        if(nums.length == 1)return true;
        //注意这里i <= range很重要
        //我们是要在覆盖范围内遍历我们的元素 再去增加我们的覆盖范围
        //不在覆盖范围内去增加是没有意义的
        for(int i = 0;i <= range;i ++){
            //为什么这里取最大值很关键
            //我要在我已有的覆盖范围内得到跳跃的长度用来增加我的覆盖范围
            //range 每次只取 max(该元素数值补充后的范围, range 本身范围)。
            //如果不取最大值 那么我的这个覆盖范围可能还会减小 
            //所以这个range要维护一个最大的覆盖范围
            range = Math.max(i + nums[i],range);
            //只要覆盖范围超过最后一个元素 则返回true
            if(range >= nums.length - 1){
                return true;
            }
        }
        return false;
    }
} 

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值