描述
假設你正在爬樓梯。需要 n 步你才能到達樓頂。示例1每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是乙個正整數。
輸入: 2示例2輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 步 + 1 步
2. 2 步
輸入: 3我第一反應是用遞迴實現,然而不出所料超出時間限制。輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 步 + 1 步 + 1 步
2. 1 步 + 2 步
3. 2 步 + 1 步
if n == 1:
return
1elif n == 2:
return
2else:
s1 = self.climbstairs(n-1)
s2 = self.climbstairs(n-2)
return s1+s2
所以。。。。再想一想。既然遞迴不行就遞推試試。emmm…網上說這個問題的結果和fibonacci數列一樣。果然是這樣。。。儘管可以轉換為求解fibonacci,但是還是應該好好思考一下怎麼解決原問題。畢竟可能會聯想不到fibonacci。
nums = [0,1,2]
if n == 1:
return nums[1]
elif n == 2:
return nums[2]
else:
for i in range(3,n+1):
return nums[n]
上面這個版本通過了,但是只戰勝了25%的人,尋求更優的演算法吧。
這個很機智啊,我的列表初始化可以優化成如下:
condition = [0] * (n + 1)
condition[0] = 1
condition[1] = 1
for i in range(2, n+1):
condition[i] = condition[i-1] + condition[i-2]
return condition[n]
關於迴圈和遞迴:
loops may achieve a performance gain for your program. recursion may achieve a performance gain for your programmer. choose which is more important in your situation!
如果使用迴圈,程式的效能會更高。如果使用遞迴,程式更容易理解。
LeetCode Python 打家劫舍I
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode Python編碼練習
貪心演算法 1.環形路上有n個加油站,第i個加油站的汽油量是gas i 你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站 i 1 花費的油量是cost i 你從乙個加油站出發,剛開始 的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回...
兩數相加 leetcode Python
給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 原因 342 465 807 definition for singly ...