LeetCode 746:使用最小花费爬楼梯 ------ 题解笔记
🔗 题目链接
👉 https://leetcode.cn/problems/min-cost-climbing-stairs/
📖 内容概要
给定一个数组 cost,其中 cost[i] 表示登上第 i 阶楼梯所需支付的费用。
你可以从第 0 阶或第 1 阶开始,支付该台阶的费用后继续向上 。
求到达顶层(楼顶)的最小花费。
✅ 动态规划
✅ 一维 DP
✅ 与「爬楼梯」「斐波那契」高度相似
💡 解题思路
一、状态定义(非常关键)
java
dp[i] = 到达第 i 阶楼梯的最小花费
⚠️ 注意:
到达第
i阶时,还没有支付cost[i]
二、状态转移方程
到达第 i 阶,只能来自:
- 第
i-1阶,再跨 1 步 - 第
i-2阶,再跨 2 步
java
dp[i] = min(
dp[i-1] + cost[i-1],
dp[i-2] + cost[i-2]
)
三、初始条件
java
dp[0] = 0; // 起点
dp[1] = 0; // 可以从第 1 阶开始
四、最终结果
java
return dp[n];
楼顶在第
n阶(数组外)
✅ AC 代码(Java)
java
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(
dp[i - 1] + cost[i - 1],
dp[i - 2] + cost[i - 2]
);
}
return dp[n];
}
}
⏱️ 复杂度分析
| 指标 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(n)(可优化为 O(1)) |
📌 三题横向对比
| 题目 | 本质 | 状态转移 | 初始条件 |
|---|---|---|---|
| 509. 斐波那契数(Fibonacci Number) | 递推 | f(i)=f(i-1)+f(i-2) |
f(0)=0, f(1)=1 |
| 70. 爬楼梯(Climbing Stairs) | 方案数 | dp[i]=dp[i-1]+dp[i-2] |
dp[0]=1, dp[1]=1 |
| 746. 最小花费爬楼梯 | 最小代价 | dp[i]=min(dp[i-1]+c[i-1], dp[i-2]+c[i-2]) |
dp[0]=0, dp[1]=0 |
✅ 三者关系图
Fibonacci → 爬楼梯 → 最小花费爬楼梯
(基础递推)(组合计数)(带权最优解)
👉 这是 DP 学习的标准演进路线
✅ 空间优化(进阶)
java
int prev2 = 0, prev1 = 0;
for (int i = 2; i <= cost.length; i++) {
int curr = Math.min(prev1 + cost[i-1], prev2 + cost[i-2]);
prev2 = prev1;
prev1 = curr;
}
return prev1;
📌 面试一句话总结
这道题是"带权重的爬楼梯",状态转移和斐波那契几乎一样,只是从求和变成了取最小值。