給定乙個非負整數陣列,你最初位於陣列的第乙個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後乙個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後乙個位置。
說明:
假設你總是可以到達陣列的最後乙個位置。
用dp[i]
表示到大a[i]
的最小步數,則轉移方程:
d p[
i]=m
in(d
p[k]
+1),
k∈[0
,i),
ifa[
k]+k
≥i
dp[i] = min(dp[k] + 1), k \in [0, i), if \; a[k] + k \geq i
dp[i]=
min(
dp[k
]+1)
,k∈[
0,i)
,ifa
[k]+
k≥i時間複雜度是o(n
2)
o(n^2)
o(n2
),超時了
貪心版:
基本思路和跳躍遊戲很相似
每次都更新當前位置能跳到的最大位置,同時儲存乙個本次起跳能跳到的最大範圍,如果當前的位置超過了上一次跳到的最大範圍,那麼就說明還要再跳1次,jump_cnt += 1
,然後更新能跳到的最大範圍即可
注意,這裡和跳躍遊戲不太一樣的地方在於,不要遍歷到最後乙個節點,否則可能會多計算一次跳躍。但是跳躍遊戲需要遍歷到最後乙個節點,因為需要檢查是否能跳到頭。
舉例來說,對於這樣的陣列:
[7,0,9,6,9,6,1,7,9,0,1,2,9,0,3]
一開始從7跳,則能跳到的範圍是:
<-|
7,0,9,6,9,6,1,0|,9,0,1,2,9,1,3
<-|
在這個範圍內移動,每一步都更新能跳到的最大範圍,然後當指標走到這個範圍的最右邊時,就找到了這個範圍內能跳到的最大值13(從第2個9跳),此時需要再次跳了。再次跳時選擇最大值跳(從第2個9跳),jump_cnt += 1
,同時更新當前能跳到的最右邊界為這個範圍內跳的最大值,也即13,下次遍歷時,變成這樣:
<-|
7,0,9,6,9,6,1,0,9,0,1,2,9,1|,3
<-|
以此類推即可
dp版:
class
solution
:def
jump
(self, nums: list[
int])-
>
int:
dp =
for i, each_jump in
enumerate
(nums)
: candidate =[1
+ dp[k]
for k in
range
(i)if nums[k]
+ k >= i]
min(candidate)
if candidate else0)
print
(i, candidate, dp)
return dp[-1
]
貪心版:
class
solution
:def
jump
(self, nums: list[
int])-
>
int:
cur_end, max_position =0,
0 cnt =
0for i in
range
(len
(nums)-1
):max_position =
max(max_position, nums[i]
+ i)
if i == cur_end:
cnt +=
1 cur_end = max_position
return cnt
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 步...