给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
给出数组A = [2,3,1,1,4],最少到达数组最后一个位置的跳跃次数是2(从数组下标0跳一步到数组下标1,然后跳3步到数组的最后一个位置,一共跳跃2次)
// version 2: Greedy
public class Solution {
public int jump(int[] A){
int max =0;
int count =0;
for(int i=0;i<A.length&&max<A.length-1;i++){
if(A[i] + i >max){//能走过也算
max =A[i]+i;
count++;
}
}
return count;
}
}
// version 1: Dynamic Programming
/* 这个方法,复杂度是 O(n^2),会超时,但是依然需要掌握。
public class Solution {
public int jump(int[] A) {
// state
int[] dp = new int[A.length];
// initialize
dp[0] = 0;
for (int i = 1; i < A.length; i++) {
dp[i] = Integer.MAX_VALUE;
}
// function
for (int i = 1; i < A.length; i++) {
for (int j = 0; j < i; j++) {
//A[j] + j >= i成立即可,即能到j处并且加上j的步数后能到i处。
if (dp[j] != Integer.MAX_VALUE && j + A[j] >= i) {
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
// answer
return dp[A.length - 1];
}
}
*/