问题概述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
解法 1:递归与记忆化
工作原理
使用递归和记忆化来避免重复计算相同的子问题:
python
class Solution:
def climbStairs(self, n):
memo = {}
def helper(remaining):
if remaining == 1:
return 1
if remaining == 2:
return 2
if remaining in memo:
return memo[remaining]
memo[remaining] = helper(remaining - 1) + helper(remaining - 2)
return memo[remaining]
return helper(n)
复杂度分析
- 时间复杂度: O(n) - 每个子问题只解决一次
- 空间复杂度: O(n) - 用于记忆化和递归栈
何时使用
- 更直观的递归方法
- 更容易理解递推关系
- 适合学习递归和记忆化
解法 2:动态规划(迭代)(推荐)
工作原理
这个问题遵循斐波那契数列模式。到达第 n 阶的方法数等于到达第 n-1 阶和第 n-2 阶的方法数之和:
python
class Solution:
def climbStairs(self, n):
if n < 3:
return n
prev2 = 1
prev1 = 2
for i in range(3, n + 1):
current = prev1 + prev2
prev2 = prev1
prev1 = current
return prev1
复杂度分析
- 时间复杂度: O(n) - 单次遍历台阶
- 空间复杂度: O(1) - 只使用常数额外空间
何时使用
- 推荐 - 最优空间复杂度
- 最快的解法
- 简单高效
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 递归(记忆化) | O(n) | O(n) | 理解递归,更直观 |
| 动态规划(迭代) | O(n) | O(1) | 大多数情况,最优空间 |
总结
要到达第 n 阶,你可以从第 n-1 阶(走 1 步)或从第 n-2 阶(走 2 步)到达。因此,ways[n] = ways[n-1] + ways[n-2]。迭代 DP 解法是最优的,空间复杂度为 O(1)。