和Jump Game思路差不多,都是DP,关键是要用一个数组maxNumbers[k]存储走k步的话,最远能够到达的序号,注意数组maxNumbers[]是递增的。
class Solution {
public:
const int MAXVALUE = 1 << 30;
int findMinStepToIndex(int maxNumbers[],int maxSteps,int index)
{
if (index == 0)
return 0;
int left = 1;
int right = maxSteps;
while (left < right)
{
int m = (left + right) / 2;
if (maxNumbers[m] < index)
{
left = m + 1;
}
else if (maxNumbers[m] > index)
{
if (maxNumbers[m - 1] < index)
return m;
else if (maxNumbers[m - 1] == index)
return m - 1;
else
right = m - 1;
}
else
{
return m;
}
}
return (right + left) / 2;
}
int jump(int A[], int n) {
int* maxNumbers = new int[n];//mark the max number that steps i can walk.
int maxIndex = 0;
int maxNumber = 0;//the max index we can walk to.
maxNumbers[0] = 0;
for (int i = 1; i < n; i++){
maxNumbers[i] = 0;
}
int maxSteps = 0;
for (int i = 0; i < n - 1; i++){
if (maxNumber < i + A[i])
{
int cMinStep = findMinStepToIndex(maxNumbers, maxSteps, i);
maxNumbers[cMinStep + 1] = i + A[i];
maxNumber = i + A[i];
maxSteps = cMinStep + 1;
if (maxNumber >= n - 1)
return maxSteps;
}
}
}
};