leetcode-55 Jump Game

来源:互联网 发布:迅雷mac版下载速度是0 编辑:程序博客网 时间:2024/05/22 03:03
原题链接: http://oj.leetcode.com/problems/jump-game/ 

这道题是动态规划的题目,所用到的方法跟是在Maximum Subarray中介绍的套路,用“局部最优和全局最优解法”。我们维护一个到目前为止能跳到的最远距离,以及从当前一步出发能跳到的最远距离。局部最优local=A[i]+i,而全局最优则是global=Math.max(global, local)。递推式出来了,代码就比较容易实现了。因为只需要一次遍历时间复杂度是O(n),而空间上是O(1)。代码如下: 

(D[i]表示从下标i能到达的最远距离,则D[i] = A[i]+i)

class Solution {public:    bool canJump(int A[], int n) {        if(A == NULL || n <= 0) return false;        int i,reach; //reach表示能到达的最远距离        for(i = 0, reach = 0; i <= reach && i < n; i++){            reach = max(i+A[i],reach);        }        if(reach < n - 1) return false;        return true;    }};

这也是一道比较经典的动态规划的题目,不过不同的切入点可能会得到不同复杂度的算法,比如如果维护的历史信息是某一步是否能够到达,那么每一次需要维护当前变量的时候就需要遍历前面的所有元素,那么总的时间复杂度就会是O(n^2)。所以同样是动态规划,有时候也会有不同的角度,不同效率的解法。这道题目还有一个扩展Jump Game II,有兴趣的朋友可以看看。


转自:http://blog.csdn.net/linhuanmars/article/details/21354751

0 0
原创粉丝点击