题目描述
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。
注:到达楼梯顶部是指通过所有阶梯
题目链接
题目分析
很明显是一道动态规划问题,当前所处位置的总花费等于前一级的总花费+其cost 与 前二级的总花费+其cost 二者中较小的一个。
动态规划三大要点
-
- 递推公式:C[i] = min(C[i - 1] + cost[i - 1], C[i - 2] + cost[i - 1])
-
- 初始化条件:C[0] = 0, C[1] = 0(vector自动初始化为0,故省去初始化条件)
-
- 遍历范围,假设有n节楼梯,那么 2 < i < n;
实现代码
int minCostClimbingStairs(vector<int>& cost)
{
int step = cost.size();
vector<int> low_cost(step + 1);
for (int i = 2; i <= step; i++)
low_cost[i] = min(low_cost[i - 1] + cost[i - 1], low_cost[i - 2] + cost[i - 2]);
return low_cost[step];
}
- 时间复杂度: O(n),一次遍历
- 空间复杂度: O(n), 一维向量
进一步优化
观察可知,当前值只与前两个值有关,故可优化为滚动数组。
int minCostClimbingStairs(vector<int>& cost)
{
int step = cost.size();
vector<int> low_cost(3);
for (int i = 2; i <= step; i++)
{
low_cost[2] = min(low_cost[1] + cost[i - 1], low_cost[0] + cost[i - 2]);
low_cost[0] = low_cost[1];
low_cost[1] = low_cost[2];
}
return low_cost[2];
}
- 时间复杂度:O(n),遍历一次
- 空间复杂度:O(1),只需要使用有限的(4个)额外空间