这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
leetcode746-使用最小花费爬楼梯
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
解题思路分析
解法1
根据题目信息可知,该题为爬楼梯问题的一个变种思路。随着在楼梯上向上爬,每一节楼梯有不同的花费。而每次爬楼梯可以爬一层或两层。因此该问题也就转化为,通过第n-1层和第n-2层爬到第n层,哪种方案的花费更少。也就是目标花费可以认为是Math.min(cost[n-1] + f(n-1),cost[n-2]+f(n-2)),这也就是状态转移方程。只需要不停的通过比较目标项前两项的最少花费,加上对应点位的花费,取其中最小值即是最小花费。dp数组可以采用每个位置的最小花费值进行记录。而通过对空间复杂度进行优化,可以用两个变量分别表示目标项前两项的花费,以此方式将空间复杂度从o(n)优化为o(1)。由于第0,1项有所不同,因此需要对第0,1项进行单独计算,后续节点直接采用动态规划在循环中计算即可。至此,题目解析完毕。
public int minCostClimbingStairs(int[] cost) {
int length = cost.length;
if(length == 1){
return cost[0];
}else if(length == 2){
return Math.min(cost[1],cost[0]);
}
int q = cost[0];
int p = cost[1];
int current = 0;
for (int i = 2; i < cost.length ; i++) {
current = Math.min(p,q) + cost[i];
q = p;
p = current;
}
return Math.min(current,q);
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。