python lintcode116 跳躍遊戲

2021-08-21 21:54:23 字數 1572 閱讀 6847

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

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

判斷你是否能到達陣列的最後乙個位置。

這個問題有兩個方法,乙個是貪心動態規劃

貪心方法時間複雜度為o(n)

動態規劃方法的時間複雜度為為o(n^2)

我們手動設定小型資料集,使大家可以通過測試的兩種方式。這僅僅是為了讓大家學會如何使用動態規劃的方式解決此問題。如果您用動態規劃的方式完成它,你可以嘗試貪心法,以使其再次通過一次。

您在真實的面試中是否遇到過這個題?  是

a =[2,3,1,1,4],返回 true.

a =[3,2,1,0,4],返回 false.

首先來看一下如何使用動態規劃求解該問題。使用動態規劃求解問題,首先需要找到問題的狀態和狀態轉化方程

假設問題的狀態,假設位置i(0≤i≤a.length)i(0≤i≤a.length)能夠跳躍的最大長度為dp[i]。 

對於陣列a = [2,3,1,1,4], 則有: 

i = 0, dp[0] = a[0] + 0 = 2 

i = 1, if dp[i-1] = dp[0]≥ i then dp[1] = max=4  else dp[1] = 0 

i = 2, if dp[i-1] = dp[1]≥ i then dp[2] = max=4 else dp[2] = 0

基於上面的分析,其狀態轉換方程為: 

dp[i]=    if dp[i−1]≥i

0   otherwise

注意:需要判斷能否到達第ii個位置

**如下:

class solution:

"""@param a: a list of integers

@return: a boolean

"""def canjump(self, a):

# write your code here

# dp陣列存第i個點能跳最遠的位置

if(len(a)==0 or a==none):return true

dp=[0 for i in range(len(a))]

dp[0]=a[0]

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

# 判斷第i個點是可以到的

if(dp[i-1]>=i):

dp[i]=max(i+a[i],dp[i-1])

else:

dp[i]=0

if(dp[len(a)-1]>=len(a)-1):

return true

else:return false

s = solution()

print(s.canjump( [5,8,3,0,6,7,9,6,3,4,5,2,0,6,2,6,7,10,8,0]))

python lintcode 433島嶼的個數

給乙個01矩陣,求不同的島嶼的個數。0代表海,1代表島,如果兩個1相鄰,那麼這兩個1屬於同乙個島。我們只考慮上下左右為相鄰。您在真實的面試中是否遇到過這個題?yes 樣例 在矩陣 1,1,0,0,0 0,1,0,0,1 0,0,0,1,1 0,0,0,0,0 0,0,0,0,1 中有 3 個島.cl...

python lintcode135 數字組合

給出乙個候選數字的set c 和目標數字 t 找到c中所有的組合,使找出的數字和為t。c中的數字可以無限制重複被選取。例如,給出候選陣列 2,3,6,7 和目標數字7,所求的解為 7 2,2,3 給出候選set 2,3,6,7 和目標數字7 返回 7 2,2,3 題目意思很明確了,這就是乙個排列組合...

python lintcode114 不同的路徑

有乙個機械人的位於乙個 m n 個網格左上角。機械人每一時刻只能向下或者向右移動一步。機械人試圖達到網格的右下角。問有多少條不同的路徑?n和m均不超過100 您在真實的面試中是否遇到過這個題?是 給出 m 3和 n 3,返回6.給出 m 4和 n 5,返回35.那麼這一題的思路就是 到某個結點的方案...