爬楼梯:一次可走 1 或 2 阶,n 阶共有多少种走法?用 DP 并优化空间。
dp[i] = dp[i-1] + dp[i-2](第 i 阶要么从 i-1 跨 1 步,要么从 i-2 跨 2 步),本质斐波那契。
// 自底向上 + 滚动变量,空间 O(1)
function climbStairs(n) {
let a = 1, b = 1 // dp[0], dp[1]
for (let i = 2; i <= n; i++) {
[a, b] = [b, a + b]
}
return b
}- 时间
O(n),空间O(1) - DP 五步:定义状态 → 转移方程 → 初始化 → 遍历顺序 → 举例推导
- 变体:可走 1/2/3 阶、最小花费爬楼梯(取 min)