1. 程式人生 > >Lintcode 117. 跳躍遊戲 II

Lintcode 117. 跳躍遊戲 II

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

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

你的目標是使用最少的跳躍次數到達陣列的最後一個位置。

public int jump(int[] A) {

    int count = 0;
    int maxPos = 0;
    int lastMaxPos = -1;
    for (int i = 0; i < A.length && maxPos < A.length; i++) {
        if (i + A[i] >= A.length-1){
            count++;
            if (i < maxPos)
                count++;
            break;
        }

        if (i == lastMaxPos){
            count+=2;
        }

        if (maxPos <= i+A[i]){
            lastMaxPos = maxPos;
            maxPos = i+A[i];
        }

    }

    return count;

}

自己的解法非常醜陋並且可讀性極差

dalao解法:

public int jump2(int[] A) {
    // write your code here
    if (A == null || A.length == 0) {
        return -1;
    }

    int start = 0, end = 0, jumps = 0;
    while (end < A.length - 1) {
        jumps++;
        int farthest = end;
        for (int i = start; i <= end; i++) {
            farthest = Math.max(farthest, A[i] + i);
        }
        start = end + 1;
        end = farthest;
    }

    return jumps;
}

summary:在jump1的基礎上,每個階段的開始總是在前一階段的結尾的基礎上進行