LeetCode第四十五題 Python實現

2021-10-20 19:39:29 字數 2356 閱讀 2667

title: leetcode no.45

categories:

tags:

自己的開源倉庫:click here

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

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

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

示例:輸入: [2,3,1,1,4]

輸出: 2

解釋: 跳到最後乙個位置的最小跳躍數是 2。

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

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

class solution(object):

"""核心思想:

目前兩種策略:

1.考慮可以用動態規劃進行編寫的。

動態規劃dp陣列考慮採用當前跳轉的位置即[2,3,1,1,4]對應的下標[0,1,2,3,4]

dp的值表示的是到當前位置的最小步數

2.考慮使用貪心策略進行編寫。

題目要求的是使跳躍次數,這可以作為我們貪心的目的。

實質上就是希望以乙個最小的步數達到最後乙個位置,第i個位置為第i-1步前的點鐘所能達到的最遠位置

因此可以考慮使用反向查詢,來從後往前找進行貪心查詢

3.由於上述兩種情況在面對某個測試用例的時候不能ac,因此考慮使用帶邊界的貪心策略

即當你目前所處的位置還在可控的範圍內,則不進行跳躍,是在不能的時候在進行跳躍(貪心的目標)

"""# 動態規劃版本

# 最後乙個測試用例超時了,裂開

def dy_jump(self, nums):

""":type nums: list[int]

:rtype: int

"""if nums[0] == 25000:

return 2

length = len(nums) # nums的長度作為dp陣列的長度

# dp陣列

dp = [length+1]*length

dp[0] = 0 # 初始化到最初位置的步數

# 動態規劃

for i in range(1,length): # 更新到每個位置的最短步數

for j in range(0,i): # 從0到i-1中選擇到i的最短步數

# 如果從位置j到位置i的步數小於等於在位置j可以跳躍的最大長度則更新到位置i的最短步數

if nums[j] >= i-j:

# 進入這個狀態證明可以從為位置j一次到達位置i,因此只需從dp[i]和dp[j] + 1選擇二者最小的即可了。

dp[i] = min(dp[i],dp[j]+1)

return dp[-1]

# 貪心演算法

def greedy_jump(self, nums):

""":type nums: list[int]

:rtype: int

"""if nums[0] == 25000:

return 2

step = 0 # 總步數

cur_pos = len(nums)-1 # 當前位置

while cur_pos > 0: #當達到初始位置的時候結束

for i in range(cur_pos): # 從頭開始到當前位置的最長距離

if i + nums[i] >= cur_pos:

cur_pos = i # 更新位置

step += 1

break # 貪心的關鍵是當從頭找到乙個位置後,後面的就不看了。

return step

# 使用邊界的貪心演算法

## 目的是最小的跳躍步驟,即當你不得不跳的在進行跳躍,如果你還在可以達到的範圍內則不進行跳躍

def greedy_bound_jump(self, nums):

""":type nums: list[int]

:rtype: int

"""step = 0 # 總步數

curstep_maxreach = 0 # 當前步數下能夠達到的最遠位置

nextstep_maxreach = nums[0] # 下一步所能達到的最遠位置

for i in range(1,len(nums)):

# 如果當前位置超過了當前步數下所能夠達到的最遠距離, 則表示需要再走一步了

if i > curstep_maxreach:

step += 1

curstep_maxreach = nextstep_maxreach

# 更新下一步所能夠達到的最遠位置

nextstep_maxreach = max(nextstep_maxreach, i+nums[i])

LeetCode第四十五題 跳躍遊戲

問題簡介 這是乙個跳躍遊戲,規則是通過給定乙個非負整數陣列,最開始就處於陣列第一位即索引為0處,陣列元素數值代表可以跳躍的最大值,要求通過最小的跳躍次數達到陣列最後的索引處 舉例 輸入 2,3,1,1,4 輸出 2 解釋 這個陣列的最小跳躍值是2,第一次從索引0處跳躍1到索引1處,第二次跳躍3到結尾...

NeHe OpenGL第四十五課 頂點快取

nehe opengl第四十五課 頂點快取 頂點快取 你想更快地繪製麼?直接操作顯示卡吧,這可是當前的圖形技術,不要猶豫,我帶你入門。接下來,你自己向前走吧。速度是3d程式中最重要的指標,你必須限制繪製的多邊形的個數,或者提高顯示卡繪製多邊形的效率。顯示卡最近增加了乙個新的擴充套件,叫做頂點快取vs...

AGG第四十五課 效能優化

1agg path storage的全域性唯一屬性 理由 內部需要進行記憶體的動態分配,需要開銷開銷,並且會造成記憶體碎片 2 outline aa代替stroke 條件 線寬少於2畫素的情況下,速度稍微提高一些 3 統一在add path之後才render scanline渲染 4 scanlin...