Jump Game -- LeetCode

                原题链接:  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 ,有兴趣的朋友可以看看。
           

猜你喜欢

转载自blog.csdn.net/qq_44910471/article/details/89473590