题目:爬楼梯
来源:Leetcode
很经典得问题,与求斐波那契数列基本一样,以下给出递归和动态规划两种解法。
递归
import functools
class Solution:
@functools.lru_cache()
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
if n == 2:
return 2
return self.climbStairs(n-1) + self.climbStairs(n-2)
注意,这里我加了Python的 @functools.lru_cache() ,他会缓存递归结果,避免重复计算从而加速递归实现。没有这个的话会超时。
动态规划
class Solution:
def climbStairs(self, n: int) -> int:
p, q, r = 0, 0, 1
for i in range(1, n+1):
p = q
q = r
r = p + q
return r
l利用了滚动数组的思想,压缩DP空间