Jump Game -- LeetCode

本文深入探讨了LeetCode上的Jump Game问题,通过动态规划的方法,采用局部最优和全局最优策略,实现了一次遍历的高效解决方案。代码示例清晰展示了算法逻辑,避免了高复杂度的遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                原题链接:  http://oj.leetcode.com/problems/jump-game/  
这道题是动态规划的题目,所用到的方法跟是在 Maximum Subarray 中介绍的套路,用“局部最优和全局最优解法”。我们维护一个到目前为止能跳到的最远距离,以及从当前一步出发能跳到的最远距离。局部最优local=A[i]+i,而全局最优则是global=Math.max(global, local)。递推式出来了,代码就比较容易实现了。因为只需要一次遍历时间复杂度是O(n),而空间上是O(1)。代码如下: 
public boolean canJump(int[] A) {    if(A==null || A.length==0)        return false;    int reach = 0;    for(int i=0;i<=reach&&i<A.length;i++)    {        reach = Math.max(A[i]+i,reach);    }    if(reach<A.length-1)        return false;    return true;}
这也是一道比较经典的动态规划的题目,不过不同的切入点可能会得到不同复杂度的算法,比如如果维护的历史信息是某一步是否能够到达,那么每一次需要维护当前变量的时候就需要遍历前面的所有元素,那么总的时间复杂度就会是O(n^2)。所以同样是动态规划,有时候也会有不同的角度,不同效率的解法。这道题目还有一个扩展 Jump Game II ,有兴趣的朋友可以看看。
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值