1. 程式人生 > >Lintcode : 116. 跳躍遊戲

Lintcode : 116. 跳躍遊戲

給出一個非負整數陣列,你最初定位在陣列的第一個位置。   

陣列中的每個元素代表你在那個位置可以跳躍的最大長度。    

判斷你是否能到達陣列的最後一個位置。

public boolean canJump(int[] A) {
    // write your code here
    if (A[0] == 0 && A.length != 1)
        return false;

    boolean canJump = false;

    int zeroPos = -1;
    for (int i = 0; i < A.length; i++) {
        if (A[i + A[i]] == 0)
            zeroPos = i + A[i];


        if (A[i] == 0 && i == A.length - 1)
            return true;

        if (A[i] + i >= A.length -1 )
            return true;

        if (A[i+A[i]] == 0 && i+A[i] == A.length -1)
            return true;
        else if (A[i + A[i]] == 0) {
            if (zeroPos == i)
                return false;
            zeroPos = i+A[i];
            continue;
        }

        i = A[i] + i - 1;

    }
    return canJump;
}

dalao思路:


public boolean canJump2(int[] A) {
    // write your code here
    if (A == null) return false;
    int n = A.length;
    if (n < 2) return true;
    int curMax = 0;
    for (int i = 0; i < n; i++) {
        if (i <= curMax) curMax = Math.max(i + A[i], curMax); //max/min 貪心的關鍵
    }
    return curMax >= n - 1;
}

dalao思路:只是討論是否能達到終點的話 ,在小於當前最大點遍歷的每一步都討論是否能得到更大的一步,最終遍歷完後如果大於長度,那就可以到達

summary:貪心策略,需要獲得全域性的最優結果,但遍歷得每一步只能得到區域性的結局/區域性最優結果,同時在處理區域性的時候 還要注意會不會出現更好的結果,有則更新 之前一直困擾於遍歷到i的時候就直接跳到a[a[i]]的結果,忽視了過程中可能會出現更好的結果