携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例1
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例2
输入: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 。
2.解析
前两天写了斐波那契数和爬楼梯,都分享了两个做法,递归和记忆数组。今天继续复习这一知识点。想看前两题的点下面链接。本题只展示记忆数组做法。
# [杨小白]_java_leetcode 509.斐波那契数
2.1解法(记忆数组)
这里用db记忆数组,实现时间复杂度O(n),空间复杂度也是O(n),也完美的解决了栈溢出。
记录第k阶台阶前面所有台阶的最小花费,第k阶台阶的最小花费为min(db[k-1],db[k-2])+cost[k],依次循环到n阶台阶。其中第一阶台阶和第二节台阶的最小花费就是自身的值。
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] db = new int[cost.length];
db[0] = cost[0];
db[1] = cost[1];
for(int i = 2; i < cost.length;i++) {
db[i] = Math.min(db[i-1] + cost[i], db[i-2] + cost[i]);
}
return Math.min(db[cost.length-1],db[cost.length-2]);
}
}
提交排名
3.结束
相信经过这三个题的记忆数组用法,大家一定对于这种简单的一维的递归优化有了深刻的理解,期间我又遇到了两个同样思想的题目,其中一个是二维记忆数组,一个是分析理解略负责,原理也是运用记忆数组的题,大家拭目以待吧。