简单题。
public class Solution {
public int jump(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int len = A.length;
if (len == 0 || len == 1) return 0;
int[] m = new int[len];
m[0] = 0;
int max = 0;
int last = -1;
for (int i = 0; i < len; i++) {
if (i + A[i] > max) {
last = max;
max = i + A[i];
for (int j = last+1; j <= max && j < len; j++) {
m[j] = m[i] + 1;
}
}
if (max >= len - 1) return m[len-1];
}
return m[len-1];
}
}
从参考的答案来看,确实可以省却m数组的:
/*
* 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;
}
};