#leetcode刷題之路45-跳躍遊戲 II

給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每一個元素表明你在該位置能夠跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。數組

示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下標爲 0 跳到下標爲 1 的位置,跳 1 步,而後跳 3 步到達數組的最後一個位置。
說明:
假設你老是能夠到達數組的最後一個位置。spa

 

思路1:用正向遞歸的方法來解決。code

void rec(vector<int>& nums,int i,int temp,int &ans,int step)//i 是當前位置 temp爲當前要跳的步長 ans記錄最短路徑 step計算下次要跳多遠
{ if(temp==0) return;//跳步爲0,返回
    if(i>=nums.size()) return;//i越界,返回
    if(i+temp>=nums.size()-1)//下一次跳步到或者包含最後一個位置
 { ans=step>=ans?ans:step; return; } //能夠從新跳了
    i=temp+i;//更新i
    temp=0;//更新temp
    step++;//更新步數
    while(temp<nums[i]) { rec(nums,i,++temp,ans,step); } } int jump(vector<int>& nums) { if(nums.size()==0||nums.size()==1) return 0; int temp=0; int step=1; int ans=INT32_MAX; while(temp<nums[0]) { rec(nums,0,++temp,ans,step); } return ans; }

 

方法是沒問題的,只是時間超時了。。。blog

 

方法2:逆向思惟,從後向前找遞歸

int rec(vector<int> &nums,int end,int &ans) { int temp=end; ans++; for(int i=end-1;i>=0;i--) { if(nums[i]>=(end-i))// 找到一個最小i,能夠直接到達末尾的下標。
            temp=i; } return temp; } int jump(vector<int>& nums) { int end=nums.size()-1; int ans=0; while(end>0) { end=rec(nums,end,ans); } return ans; }

還超時,牛皮。。。class

方法3:貪心方法

int jump(vector<int>& nums) { int ans=0; int i=0; int left=0,right=0;//在這個區間內計算該選哪一個跳步長度
    while(right<nums.size()-1) { int next=0;//記錄下一個要跳去的地方
        for(i=left;i<=right;i++) next=max(i+nums[i],next); left=right+1; right=next; ans++; } return ans; }
相關文章
相關標籤/搜索