想了一個晚上,第一個思路是用動態規劃,記錄走到每一個節點需要跳動的最小步數,大致方法是每走到一個節點就遍歷一下前面的全部節點,看看哪個節點可以一部跳到該節點,然后從中選取跳躍步數最小的節點,最后輸出最后一個節點的跳躍步數即可。
當時想到這個方法的時候就有會時間超限的直覺…結果還真時間超限了…………改了一下通過了但運行時間擊敗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;}
};