/**
* 給出一個非負整數數組,你最初在數組第一個元素的位置
* 數組中的元素表明你在這個位置能夠跳躍的最大長度
* 你的目標是用最少的跳躍次數來到達數組的最後一個元素的位置
* 例如
* 給出數組 A =[2,3,1,1,4]
* 最少須要兩次才能跳躍到數組最後一個元素的位置。
*(從數組下標爲 0的位置跳長度1到達下標1的位置,而後跳長度3到數組最後一個元素的位置)
*/
public class Main57 {
public static void main(String[] args) {
int[] A = {2,3,1,1,4};
System.out.println(Main57.jump(A));
}
public static int jump(int[] A) {
// int[] dp = new int[A.length]; // dp存放都到各點的最小步數
// for (int i = 0; i < dp.length; i ++) {
// int maxPosition = Math.min(i + A[i], A.length - 1); // 從i點出發能走的最遠距離
// for (int j = i + 1; j <= maxPosition; j ++) {
// if(dp[j] == 0) dp[j] = dp[i] + 1; // 若是位置沒被走過,則到達j點的步數爲dp[i]+1
// }
// if(dp[A.length - 1] != 0) break; // 當第一次到達終點時,確定是到達終點最短的步數
// }
// return dp[A.length - 1];
int jumps = 0, curEnd = 0, curFarthest = 0;
for (int i = 0; i < A.length - 1; i++) {
curFarthest = Math.max(curFarthest, i + A[i]);
if (i == curEnd) {
jumps++;
curEnd = curFarthest;
}
}
return jumps;
}
}