1. 爬楼梯问题解析:从递归到动态规划的思维跃迁
第一次在LeetCode上遇到爬楼梯问题时,我盯着屏幕看了足足五分钟——题目描述简单到令人怀疑:"每次可以爬1或2个台阶,有多少种不同的方法可以爬到第n阶?"这看似小学数学题背后,却隐藏着算法设计的精妙思想。作为动态规划的经典入门题,它完美诠释了如何将生活场景转化为数学模型。
这道题之所以被各大科技公司频繁用作面试题,是因为它能考察面试者三个核心能力:问题抽象能力(将实际场景转化为数学模型)、算法选择能力(识别问题特征选择合适解法)以及代码实现能力(边界条件处理和空间优化)。我见过不少候选人在白板上画了半天楼梯却写不出状态转移方程,也遇到过能直接写出最优解却解释不清思路的应试者。真正理解这道题,远比AC(Accept)更重要。
需要模型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)
这种解法虽然直观,但存在严重的性能问题。以n=5为例,调用栈会这样展开:
code复制climbStairs(5)
├── climbStairs(4)
│ ├── climbStairs(3)
│ │ ├── climbStairs(2)
│ │ └── climbStairs(1)
│ └── climbStairs(2)
└── climbStairs(3)
├── climbStairs(2)
└── climbStairs(1)
时间复杂度高达O(2^n),当n=40时,在我的笔记本上运行需要约15秒。这是因为存在大量重复计算——climbStairs(3)被计算了两次,climbStairs(2)被计算了三次。
关键教训:递归解法一定要先画调用树,确认是否存在重复计算。如果发现重叠子问题,就该考虑动态规划。
2.2 记忆化递归:空间换时间的平衡术
在纯递归基础上加入缓存,就是记忆化搜索(Memoization):
