版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/81841822
111. 爬楼梯
假设你正在爬楼梯,需要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)的时间复杂度,原理:https://blog.csdn.net/qq_36387683/article/details/81939513。
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