代码来自:http://discuss.leetcode.com/questions/223/jump-game-ii
本题目的解法和Leetcode OJ test case都有问题,没有考虑不可达的情况。
/*
* We use "last" to keep track of the maximum distance that has been reached
* by using the minimum steps "ret", whereas "curr" is the maximum distance
* that can be reached by using "ret+1" steps. Thus,
* curr = max(i+A[i]) where 0 <= i <= last.
*/
class Solution {
public:
int jump(int A[], int n) {
int ret = 0;
int last = 0;
int curr = 0;
for (int i = 0; i < n; ++i) {
if (i > last) {
last = curr;
++ret;
}
curr = max(curr, i+A[i]);
}
return ret;
}
};
Method 2. DP
http://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/
jumps[i]表示从0到i的最小步数。
class Solution {
public:
int jump(int arr[], int n) {
int *jumps = new int[n]; // jumps[n-1] will hold the result
int i, j;
if (n == 0 || (n == 1 && arr[0] == 0))
return 0;
jumps[0] = 0;
// Find the minimum number of jumps to reach arr[i]
// from arr[0], and assign this value to jumps[i]
for (i = 1; i < n; i++)
{
jumps[i] = INT_MAX;
for (j = 0; j < i; j++)
{
if (i <= j + arr[j] && jumps[j] != INT_MAX)
{
jumps[i] = min(jumps[i], jumps[j] + 1);
break;
}
}
}
return jumps[n-1];
}
};
method 3, DP
class Solution {
public:
int jump(int A[], int n) {
vector<int> f(n, n+1);
f[0] = 0;
int reach = 0;
for(int i=0; i<=reach && i<n; i++)
{
reach = max(reach, i+A[i]);
for(int j=min(reach, n-1); j>i; j--)
{
if(f[j] != n+1) break;
f[j] = min(f[j], f[i]+1);
}
}
return f[n-1];
}
};