假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?
比如n=3,1+1+1=1+2=2+1=3,共有3種不同的方法
返回 3
很經典的動態規劃問題,第一階只有1, 第二階有1+1, 2兩種,第三階就有 1,1,1; 1,2;2,1三種,
第四階有2+3 =5種,依次類推,可以找出彼此之間的關係為 dp[i] = dp[i-1] + dp[i-2]。這個也是斐波那契數列數列的求解公式,所以也可以用斐波那契的經典求解方式。
還有一種是利用矩陣乘法的方式,可以達到0(logn)的時間複雜度,原理:
class solution:
"""@param n: an integer
@return: an integer
"""'''
#動態規劃
def climbstairs(self, n):
# write your code here
if n < 3:
return n
dp = [0] * (n+1)
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
''''''
斐波那契式求解
def climbstairs(self, n):
# write your code here
if n < 3:
return n
before1 = 1
before2 = 2
res = 0
for i in range(n-2):
res = before1 + before2
before1 = before2
before2 = res
return res
'''#時間複雜度o(logn), 利用矩陣求解
def climbstairs(self, n):
# write your code here
if n < 3:
return n
base = [[1, 1], [1, 0]]
res = self.matrixpower(base, n-2)
return 2*res[0][0] + res[1][0]
def matrixpower(self, m, p):
res = [[0] * len(i) for i in m]
for i in range(len(res)):
res[i][i] = 1
tmp = m
while p!= 0:
if p&1 != 0:
res = self.mulimatrix(res, tmp)
tmp = self.mulimatrix(tmp, tmp)
p = p>>1
return res
def mulimatrix(self, m1, m2):
res = [[0] * len(m2[0]) for _ in m1]
for i in range(len(m1)):
for j in range(len(m2[0])):
for k in range(len(m2)):
res[i][j] += m1[i][k] * m2[k][j]
return res
lintcode 111 爬樓梯 排列組合方法
問題描述 假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?問題目前解法 其實 是斐波那契數列 因為一次只能走1步或2步,第n 階樓梯,是從n 1或n 2那一階梯上來的,方法數也 就是兩者之和,通項 a n a n 1 a n 2 但是在下第一次...
SICP練習 7 練習1 11
這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...
leetcode騰訊精選練習50(23) 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 2 階示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1 階 1 ...