[leetcode]Jump Game

一开始用了DP,大数据超时了。

超时的版本:

public class Solution {
    public boolean canJump(int[] A) {
        // Start typing your Java solution below
        // DO NOT write main() function
        int len = A.length;
        if (len == 0 || len == 1) return true;
        boolean m[] = new boolean[len];
        m[0] = true;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < i; j++) {
                if (i - j <= A[j] && m[j]) {
                    m[i] = true;
                    continue;
                }
            }
        }
        
        return m[len-1];
    }
}

后来也思维一转,直接从前往后扫就是了,,但感觉复杂度没有本质区别,果然还是超时。

后来再看了网上的参考,理解到本质上,只有A[i]为0(或负数)的情况下,才会不能继续往前跳,那么从左向右扫,并维持一个当前能跳到的最远的距离就行了。

public class Solution {
    public boolean canJump(int[] A) {
        // Start typing your Java solution below
        // DO NOT write main() function
        int len = A.length;
        if (len == 0 || len == 1) return true;
        int max = 0;
        for (int i = 0; i < len; i++) {
            if (A[i] <= 0 && i == max) {
                return false;
            }
            else {
                if (A[i] > 0 && A[i] + i > max) {
                    max = A[i] + i;
                }
            }
            if (max >= len - 1) return true;
        }
        return false;
    }
}

第二刷:Annie的版本更漂亮 https://github.com/AnnieKim/LeetCode/blob/master/JumpGame.h

class Solution {
public:
    bool canJump(int A[], int n) {
        int maxLen = 0;
        for (int i = 0; i < n; i++)
        {
            if (maxLen >= n - 1)
                return true;
            if (i > maxLen)
                return false;
            int curMax = i + A[i];
            maxLen = max(maxLen, curMax);
        }
    }
};

  

posted @ 2013-08-11 17:29  阿牧遥  阅读(297)  评论(0编辑  收藏  举报