简单LeetCode 70动画补充中引导学习
爬楼梯
动态规划:从最后一步倒着想
爬到第 n 级的走法数 = 爬到第 n-1 级(最后一步走 1 级)+ 爬到第 n-2 级(最后一步走 2 级);也就是 f(n) = f(n-1) + f(n-2),用两个变量滚动递推。
时间复杂度 O(n)空间复杂度 O(1)
题单:面试热题
题目描述
你需要爬 n 级台阶,每次可以爬 1 级或 2 级。问共有多少种不同的方法爬到楼顶。
学习目标
能定义 f(i)、写出 f(i) = f(i-1) + f(i-2),并用两个变量滚动把空间降到 O(1)。
已完成 0 / 6 阶段
诊断
先问:最后一步从哪里来
爬到第 n 级,最后一步可能走了几级?它分别来自哪一级?
f(n) 表示爬到第 n 级的走法数,它等于?
建议先完成当前阶段(提示 / 检查 / 自评),再进入下一步;也可以直接跳过。
解题思路
核心思想
爬到第 n 级的走法数 = 爬到第 n-1 级(最后一步走 1 级)+ 爬到第 n-2 级(最后一步走 2 级);也就是 f(n) = f(n-1) + f(n-2),用两个变量滚动递推。
为什么需要它
直接递归会大量重复计算(f(n) 被反复拆开重算),时间复杂度是指数级——需要把它变成一条从底向上的递推链。
第一反应:直觉方案
按定义写递归 f(n) = f(n-1) + f(n-2),代码两行——但 n 一大就跑不动了。
关键洞察
关键洞察有两点。第一,"最后一步只能来自 n-1 或 n-2"这个视角让计数有了递推结构——不是枚举所有走法,而是问"最后一步怎么来的"。第二,每个状态只依赖前两个状态,所以不需要整张表:两个变量滚动就够(空间从 O(n) 降到 O(1))。更重要的心智模型:动态规划不是背递推式,而是先定义状态(f(i) 表示什么)、再找转移(f(i) 从哪来)、最后定初始值——三步套在任何 DP 题上都一样。
时间复杂度 O(n)空间复杂度 O(1)
易错点
- 初始值:f(1) = 1、f(2) = 2(两级台阶有 1+1 和 2 两种走法)
- n 为 1 或 2 时直接返回(初始值就是答案)
- 滚动更新写成 prev, cur = cur, prev + cur(JS 用解构同理)——顺序写反就错
参考代码
参考代码
1function climbStairs(n) {
2 if (n <= 2) return n;
3 let prev = 1, cur = 2; // f(1), f(2)
4 for (let i = 3; i <= n; i++) {
5 [prev, cur] = [cur, prev + cur];
6 }
7 return cur;
8}
逐步演示
这道题目前是索引版:题面、解题思路与双语言代码已是完整内容; 逐步动画会按计划补充。