給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。
陣列中的每個元素代表你在那個位置可以跳躍的最大長度。
判斷你是否能到達陣列的最後乙個位置。
這個問題有兩個方法,乙個是貪心
和動態規劃
。
貪心
方法時間複雜度為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.那麼這一題的思路就是 到某個結點的方案...