想了一个晚上,第一个思路是用动态规划,记录走到每一个节点需要跳动的最小步数,大致方法是每走到一个节点就遍历一下前面的全部节点,看看哪个节点可以一部跳到该节点,然后从中选取跳跃步数最小的节点,最后输出最后一个节点的跳跃步数即可。
当时想到这个方法的时候就有会时间超限的直觉…结果还真时间超限了…………改了一下通过了但运行时间击败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;}
};