[Lintcode]跳躍遊戲 II
阿新 • • 發佈:2019-02-17
給出一個非負整數陣列,你最初定位在陣列的第一個位置。
陣列中的每個元素代表你在那個位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後一個位置。
樣例
給出陣列A = [2,3,1,1,4],最少到達陣列最後一個位置的跳躍次數是2(從陣列下標0跳一步到陣列下標1,然後跳3步到陣列的最後一個位置,一共跳躍2次)
分析,一維DP。res[i]代表到達i處的步數。public class Solution { /** * @param A: A list of lists of integers * @return: An integer */ public int jump(int[] A) { if(A.length == 0) return 0; int[] res = new int[A.length]; res[0] = 1; for(int i = 1; i < A.length; i++) { for(int j = i - 1; j >= 0; j--) { //(2) A[j] + j >= i成立即可,即能到j處並且加上j的步數後能到i處。之前步數可以忽略。假如之前步數足夠大可以到達i點,則總步數與從j處開始一樣。如果很大但是不足以到達i處,假設到達k處,那麼與之前的情況一致,在k處考慮A[k] + k > i是否成立即可。
if(res[j] != 0 && A[j] + j >= i) {
//(1)
if(res[i] == 0) res[i] = res[j] + 1;
else res[i] = Math.min(res[j] + 1, res[i]);
}
}
}
return res[A.length - 1] - 1;
}
}