題目:
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。
示例:
輸入:[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 步...