给定一个非负整数数组,最初你被放在数组的第一个元素上,数组的每个元素代表你能跳的最大的步数。你的目标是用最少的跳数抵达最后一个元素。
例如,给定A = [2,3,1,1,4],抵达终点的最小跳数是2(下标0->下标1->下标4)。
思路一:
table[i]表示从数组下标i的位置抵达最后一个元素的最少跳数。对于在下标i用1跳抵达的地方(最远跳arr[i],最近跳1跳),可以写出状态转移方程:
table[i]=table[i+k]+1,(1<=k<=arr[i])
从后往前,逐渐建立一维table,table[0]即为所求。复杂度是O(n^2)。
代码如下:
class Solution {
public:
int jump(int A[], int n) {
int *table = new int[n];
table[n-1] = 0;
for (int i = n-2; i >=0; i--) {
if (A[i] == 0)
table[i] = INT_MAX;
else if (A[i] >= n - i - 1)
table[i] = 1;
else {
int min = INT_MAX;
for (int j = i+1; j < n &&
j <= A[i] + i; j++) {
if (min > table[j])
min = table[j];
}
if (min != INT_MAX)
table[i] = min + 1;
else
table[i] = min;
}
}
return table[0];
}
};
思路二:
table[i,j]表示从下标i到下标j需要的最小跳数。那么状态转移方程是:
if arr[i]+i>=j
then table[i,j]=1
else
table[i,j]=min{table[i,k]+table[k,j]}, (i<k<j)
复杂度是O(n^3)。