和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;
}
}
}
};版权声明:本文博主原创文章,博客,未经同意不得转载。
原文:http://www.cnblogs.com/lcchuguo/p/4868267.html