lintcode練習 111 爬樓梯

2021-08-25 02:48:18 字數 1760 閱讀 8190

假設你正在爬樓梯,需要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 ...