45. 跳躍遊戲 ii
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。
示例:輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後乙個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後乙個位置。
說明:假設你總是可以到達陣列的最後乙個位置。
首先計算每乙個點的能夠達到的最遠點,nums[ i ] + i
第一次執行,以第乙個點為起點,能夠達到的最遠點為max_pos,以[2, 3, 1, 1, 4] 舉例,第一次的最遠點索引為max_pos = 2,這個時候 pre==end, 更新邊界end, 這裡邊界的意思就是:以第乙個點為起點,走一步,最多走到end = 2(索引)。
之後遞增 i,即 i = , 當 i == 1的時候,我們可以計算出來乙個最遠點max_pos, 將其與之前求出的最遠點取max, 這裡更新 max_pos的意思就是,走第二步,最遠可以走到**(max_pos 當 pre == end的時候,end 會更新等於max_pos)。
以此類推,注意:我們迴圈的時候 最後乙個索引不用計算,因為我們的目的地就是大於等於最後乙個索引的位置。
from typing import list
#遞迴的方法,超時。
# class solution:
# def jump(self, nums: list[int]) -> int:
# final = len(nums)
# out =
# if final == 1: return 0
# def greed(start, count):
# if nums[start] + start >= final - 1:
# return
# mid = nums[start] + start
# for i in range(mid, start, -1):
# greed(i, count+1)
# greed(0, 0)
# return min(out)
class
solution
:def
jump
(self, nums: list[
int])-
>
int:
final =
len(nums)
max_pos, end, step =0,
0,0for pre in
range
(final-1)
:#計算每乙個數能夠到達的最遠點
max_pos =
max(max_pos, nums[pre]
+pre)
#如果本次邊界比之前的邊界大就更新
if pre == end:
#當達到之前一次能夠走的最遠點時,就步數加一,並且更新最遠頂的邊界
step +=
1 end = max_pos
return step
if __name__ ==
"__main__"
: s = solution(
)# nums = [2,3,1,1,2,3,1,2,3,2,3,1,1,2,1,1,1,4,2,1,1,1,4,3,4]
# nums = [2,3,2,1,1,1,4,3,4]
nums =[2
,3,1
,1,4
]# nums = [5,9,3,2,1,0,2,3,3,1,0,0]
# nums = [5,6,4,4,6,9,4,4,7,4,4,8,2,6,8,1,5,9,6,5,2,7,9,7,9,6,9,4,1,6,8,8,4,4,2,0,3,8,5]
print
(s.jump(nums)
)
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 步...