题目:
- 给你一个整数数组
cost
,其中cost[i]
是从楼梯第i
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬 一个 或者 两个 台阶。 - 你可以选择从下标为
0
或下标为1
的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。
示例:
- 输入: c o s t = [ 1 , 100 , 1 , 1 , 1 , 100 , 1 , 1 , 100 , 1 ] cost = [1,100,1,1,1,100,1,1,100,1] cost=[1,100,1,1,1,100,1,1,100,1]
- 输出: 6 6 6
- 解释: 你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
- 总花费为 6 。
解题思路:
- 确定dp数组以及下标的含义:
dp[i]
表示跳到第i
个台阶需要花费的最少体力。 - 确定递推公式: 由于每次只能爬 1 个台阶或者 2 个台阶,故有两种方式获取
dp[i]
,① 从dp[i - 1]
跳到dp[i]
,花费cost[i - 1]
体力;② 从dp[i - 2]
跳到dp[i]
花费cost[i - 2]
体力。因此dp[i]
应从这两种方式中取最小值,也就是花费体力最小的一种方式,即dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
。 - dp数组初始化: 题目中写到 “可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯”,因此将
dp[0]
与dp[1]
初始化为 0。 - 确定遍历顺序: 从 2 开始从前往后遍历。
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
int dp[n + 1];
dp[0] = dp[1] = 0;
for(int i = 2; i <= n; i++){
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[n];
}
};
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)