0746. 使用最小花费爬楼梯【简单】
1. 📝 题目描述
- 给你一个整数数组
cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。 - 一旦你支付此费用,即可选择向上爬一个或者两个台阶。
- 你可以选择从下标为
0或下标为1的台阶开始爬楼梯。 - 请你计算并返回达到楼梯顶部的最低花费。
示例 1:
txt
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15,向上爬两个台阶,到达楼梯顶部。
总花费为 15。1
2
3
4
5
2
3
4
5
示例 2:
txt
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1,向上爬一个台阶,到达楼梯顶部。
总花费为 6。1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
提示:
2 <= cost.length <= 10000 <= cost[i] <= 999
2. 🫧 评价
s.1- 使用数组记录了抵达所有台阶的最小开支s.2- 只需要记录当前台阶的前两个台阶的最小开支,即可算出抵达当前台阶的开支,省去了数组的开销- 提交结果:


3. 🎯 s.1 - 动态规划
js
/**
* @param {number[]} cost
* @return {number}
*/
var minCostClimbingStairs = function (cost) {
const n = cost.length
// dp[i] 表示到达第i个台阶的最小花费
const dp = new Array(n + 1)
// 初始状态:可以从第0个或第1个台阶开始,所以花费为0
dp[0] = 0
dp[1] = 0
// 状态转移:到达第i个台阶可以从第i-1或第i-2个台阶而来
for (let i = 2; i <= n; i++) {
dp[i] = Math.min(
dp[i - 1] + cost[i - 1], // 从第i-1个台阶爬上来
dp[i - 2] + cost[i - 2] // 从第i-2个台阶爬上来
)
}
return dp[n] // 到达楼梯顶部的最小花费
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 时间复杂度:
,其中 n 是数组的长度,需要遍历一次数组 - 空间复杂度:
,需要额外的 dp 数组存储状态
算法思路:
- 定义
dp[i]为到达台阶i的最低花费(i表示站在第i级台阶的顶部) - 初始化:
dp[0] = 0、dp[1] = 0(从 0 或 1 开始无需付费) - 转移:
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]),i从 2 遍历到n - 答案:
dp[n],其中n = cost.length,表示到达楼顶的最低花费
4. 🎯 s.2 - 动态规划(空间优化版)
js
/**
* @param {number[]} cost
* @return {number}
*/
var minCostClimbingStairs = function (cost) {
const n = cost.length
// 只需要记录前两个状态
let prev2 = 0 // dp[i-2]
let prev1 = 0 // dp[i-1]
for (let i = 2; i <= n; i++) {
const current = Math.min(
prev1 + cost[i - 1], // 从第i-1个台阶爬上来
prev2 + cost[i - 2] // 从第i-2个台阶爬上来
)
prev2 = prev1
prev1 = current
}
return prev1
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 时间复杂度:
,其中 n 是数组的长度 - 空间复杂度:
,只使用了常数个额外变量
算法思路:
- 使用两个变量压缩
dp数组,分别表示dp[i-2]与dp[i-1] - 初始化:
prev2 = 0、prev1 = 0 - 迭代:对
i从 2 到n,计算current = min(prev1 + cost[i-1], prev2 + cost[i-2]),再更新prev2 = prev1、prev1 = current - 返回
prev1作为dp[n]