最经典的爬台阶问题
递归树的思路:
红色的有重复计算,所以用空间换时间的思想来优化递归。
# -*- encoding: utf-8 -*-
class Solution:
"""对于递归树来说,使用纯递归的方法,O(n)=2^n,有重复计算的情况"""
def stairs_climbing(self, n: int) -> int:
if n == 2: return 2
if n == 1: return 1
return self.stairs_climbing(n - 1) + self.stairs_climbing(n - 2)
def climbStairs(self, n: int) -> int:
return self.stairs_climbing(n)
class Solution2:
"""使用了一个全局变量用来存储算过的值,从上到下的递归方法,
这里还有一个不太好理解的地方是当有0个台阶时,没法走,也算是一种方法。
"""
def stairs_climbing(self, n: int) -> int:
if self.memo[n] == 0:
self.memo[n] = self.stairs_climbing(n - 1) + self.stairs_climbing(n - 2)
return self.memo[n]
def climbStairs(self, n: int) -> int:
self.memo = [0] * (n + 1)
self.memo[0], self.memo[1] = 1, 1
return self.stairs_climbing(n)
class Solution3:
"""同样使用一个全局变量来存储计算过的值,不过是从下到上的方法,不用递归"""
def climbStairs(self, n: int) -> int:
memo = [0] * (n + 1)
memo[0], memo[1] = 1, 1
if memo[n] == 0:
for i in range(2, n + 1):
memo[i] = memo[i - 1] + memo[i - 2]
return memo[n]
if __name__ == '__main__':
solution = Solution3()
rest = solution.climbStairs(100)
print(rest)
那到底什么是动态规划呢?
可以把复杂问题分解为子问题,并且子问题还可以优化。
当然这里还涉及到两种思想,分别是
- 从上到下的思考问题(使用递归)
- 从下到上的实现(可以不使用递归)