1. 爬楼梯问题解析
爬楼梯问题是一个经典的动态规划入门题目,题目描述很简单:假设你正在爬楼梯,每次你可以爬1个台阶或2个台阶。问有多少种不同的方法可以爬到第n个台阶。
这个问题看似简单,但蕴含着重要的算法思想。我第一次遇到这个问题时,直觉是用递归解决,但后来发现递归存在严重的性能问题。通过深入分析,我找到了更优的动态规划解法。
1.1 问题建模
首先我们需要明确问题的数学模型。设f(n)为爬到第n个台阶的方法数,那么:
- 当n=1时,只有1种方法(爬1步)
- 当n=2时,有2种方法(1+1或直接2步)
- 对于n>2的情况,最后一步要么是从n-1台阶爬1步上来,要么是从n-2台阶爬2步上来
因此可以得到递推关系:
f(n) = f(n-1) + f(n-2)
这实际上就是斐波那契数列的定义。理解这个递推关系是解决问题的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法分析与优化
2.1 递归解法
最直观的解法是递归:
python复制def climbStairs(n):
if n == 1: return 1
if n == 2: return 2
return climbStairs(n-1) + climbStairs(n-2)
但这种解法存在严重问题:
- 时间复杂度是O(2^n),因为每次调用会产生两个子调用
- 存在大量重复计算,比如计算f(5)需要计算f(4)和f(3),而f(4)又要计算f(3)和f(2)
提示:在实际面试中,如果直接给出这种解法而不指出问题,可能会被扣分。
2.2 记忆化递归
为了解决重复计算问题,可以引入记忆化技术:
python复制def climbStairs(n, memo={}):
if n in memo: return memo[n]
if n == 1: return 1
if n == 2: return 2
memo[n] = climbStairs(n-1, memo) + climbStairs(n-2, memo)
return memo[n]
这样时间复杂度降为O(n),空间复杂度也是O(n)。这是一个明显的改进,但仍然使用了递归调用栈。
