给出一维的数据,A[i]表示在第i个位置可以最大步跃为A[i],也就是求出到达数组末端最少要跳几次
刚开始的时候给出了一个O(n^2)的解法,后来超时了,然后优化到o(N)。
是一道dp题目,状态方程如下
在第i次跳跃中,pre为开始位置,假设最远可以跳到next位置
那么在pre-next的区间dp[] = i;
那么第i+1次的跳跃可以就是以next + 1开始,下一次最远可以到的next值就是Max(A[j] + j) pre <= j <= next
public class Solution {
public int jump(int[] A) {
int[] dp = new int[A.length + 1];
for(int i = 1; i < A.length; ++i){
dp[i] = Integer.MAX_VALUE;
}
int cur = 1;
int pre = 0, next = A[0];
// System.out.println(A.length);
for(int i = 1; i < A.length && i <= next; ){
int maxJump = 0;
while(i < A.length && i <= next){
dp[i] = cur;
if(A[i] + i > maxJump){
maxJump = A[i] + i;
}
++i;
}
cur ++;
pre = next + 1;
next = maxJump;
}
return dp[A.length - 1];
}
}