第一反应动态规划,代码如下,但是超时了
class Solution {
public:
int jump(int A[], int n) {
int* steps=new int[n];
steps[0]=0;
for(int i=1;i<n;++i)
{
int minStep=n*2;
for(int j=0;j<i;++j)
{
if(((j+A[j])>=i)&&((steps[j]+1)<minStep))
{
minStep=steps[j]+1;
}
}
steps[i]=minStep;
}
return steps[n-1];
}
};
上网查找后,找到了O(n)复杂度的算法,可以参考 http://www.cnblogs.com/lichen782/p/leetcode_Jump_Game_II.html
class Solution {
public:
int jump(int A[], int n) {
/*
<span style="white-space:pre"> </span>* We use "last" to keep track of the maximum distance that has been reached
<span style="white-space:pre"> </span>* by using the minimum steps "ret", whereas "curr" is the maximum distance
<span style="white-space:pre"> </span>* that can be reached by using "ret+1" steps. Thus,
<span style="white-space:pre"> </span>* curr = max(i+A[i]) where 0 <= i <= last.
<span style="white-space:pre"> </span>*/
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;
}
};