演算法學習 leetcode45 跳躍遊戲 II

2021-09-12 09:14:42 字數 1460 閱讀 1502

題目:

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。

示例:

輸入:[2,3,1,1,4]輸出:2解釋:跳到最後乙個位置的最小跳躍數是2

從下標為 0 跳到下標為 1 的位置,跳1步,然後跳3步到達陣列的最後乙個位置。

說明:

假設你總是可以到達陣列的最後乙個位置。

解題思路:

從後往前找,每次都使最後跨的步數盡可能大,找到之後截斷後面的,重複前面的操作

例如:【2,3,1,1,4】

先看nums[0]是否能跨四步到達 4,不能,再看nums[1]能不能跨三步到達4,可以,就把3後面的截斷,對陣列【2,3】重複上面的操作,截斷一次,次數加一

但是這樣寫出來的**時間複雜度太大了

class solution 

int caljump(vector& nums,int x,int& time)

}return leftlen;

}};

執行用時 : 2116 ms, 在jump game ii的c++提交中擊敗了0.91% 的使用者

記憶體消耗 : 12.3 mb, 在jump game ii的c++提交中擊敗了0.65% 的使用者

太菜了在部落格上找到另一種解法:

假設你總是可以到達陣列的最後乙個位置。思路:貪心法來做,時間複雜度o(n). 用變數aa來記錄上一次能達到的最遠位置,times記錄所用的最小跳躍數,說明times步區能達到的最遠位置是aa,比如在input,這個區間內,1步區所能達到的最遠位置是7。在 i 到達aa(7)之前,所有的位置都可以通過times步數(1步)來達到,因此這個區間之內,每乙個點當前可以達到的最遠位置bb= max(bb, nums[i]+i),最小跳躍數為times+1(2步)。到了i=aa(即i==7)的時候,更新aa=max(bb, aa+nums[aa])=14, ++times, 也就是說標誌著1步區的結束,2步區的開始,此時2步區所能達到的最遠位置為aa=14。成為下一階段3步區的前乙個最優解。重複該過程。

class solution 

aa = max(bb,aa+nums[aa]);//比較1步區里和一步區最後乙個元素那個走得更遠,更新aa,得到2步區最遠

++times;

}return times;

}};

執行用時 : 20 ms, 在jump game ii的c++提交中擊敗了21.59% 的使用者

記憶體消耗 : 10.6 mb, 在jump game ii的c++提交中擊敗了0.65% 的使用者

Leetcode 45 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...

Leetcode 45 跳躍遊戲

貪心 由區域性最優匯出全域性最優。對於該點能跳到的所有點loc 1 nums loc 考慮跳到之後還能跳多遠k nums loc k 哪個點最遠就跳到哪。學習題解的寫法 貪心的思想不變 還是找目前最有利的選擇來構成全域性最佳!在每一跳內找下一次的最遠距離!maxpos為在考慮範圍內能找到的跳到的最遠...

leetcode 45 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...