青蛙跳台阶
· 约 1 分钟阅读 · – 次阅读
leetcode
青蛙爬上最后一级台阶的时候,可能是一次跳了一步,也可能是一次跳了两步 所以方案数f(n) = f(n-1) + f(n-2)
递归的方法
超时无法通过OJ,
class Solution:
def climbStairs(self, n: int) -> int:
if n == 0 or n == 1:
return 1
if n == 2:
return 2
return self.climbStairs(n-1) + self.climbStairs(n-2)
动态规划的方法
时间复杂度和空间复杂度都是O(n)
class Solution:
def climbStairs(self, n: int) -> int:
if n == 0 or n == 1:
return 1
result = [1] * (n+1)
result[2] = 1
for i in range(2, n+1):
result[i] = result[i-1] + result[i-2]
return result[n]
考虑到其实每次只需要结果值的前两个值,所以我们可以用p,q,r轮动的方式去推进 可以降低空间复杂度到O(1)
class Solution:
def climbStairs(self, n: int) -> int:
if n == 0 or n == 1:
return 1
p = 0
q = 0
r = 1
for i in range(1, n+1):
p = q
q = r
r = p + q
return r
还有矩阵快速幂的方法
如果一个问题可与转化为求解一个矩阵的 n次方的形式,那么可以用快速幂来加速计算