想了一个晚上,第一个思路是用动态规划,记录走到每一个节点需要跳动的最小步数,大致方法是每走到一个节点就遍历一下前面的全部节点,看看哪个节点可以一部跳到该节点,然后从中选取跳跃步数最小的节点,最后输出最后一个节点的跳跃步数即可。
当时想到这个方法的时候就有会时间超限的直觉…结果还真时间超限了…………改了一下通过了但运行时间击败5%的代码………………………………
class Solution {
public:
int jump(vector<int>& nums) {
int result=0;
int location=0;
int b[nums.size()];
b[0]=0;
for(int i=1;i<nums.size();i++){
int m=100000;
for(int j=0;j<i;j++){
if(nums[j]>=i-j&&b[j]+1<m) m=b[j]+1;
}
b[i]=m;
}
return b[nums.size()-1];
}
};
然后看了一眼解析,发现新的思路:依次算出运行n步能到达的最远节点,然后取那个最远能到最后一个节点的步数。
用这种思路做了一下,然后时间复杂度击败70%代码………………
class Solution {
public:
int jump(vector<int>& nums) {
int step=0;
int start=0;
int end=0;
while(end<nums.size()-1){
int maxx=0;
for(int i=start;i<end+1;i++){
maxx=max(maxx,i+nums[i]);
}
start=end;
end=maxx;
step++;
}
return step;
}
};