当前位置:网站首页>746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯
2022-07-22 18:03:00 【陌上小布】
题目链接
https://leetcode.cn/problems/min-cost-climbing-stairs/
一、题目描述
给你一个整数数组 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 <= cost.length <= 1000
0 <= cost[i] <= 999
二、思路
1.动态规划
1.确定dp数组以及下标的含义
使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。
dp[i]的定义:到达第i个台阶所花费的最少体力为dp[i]。
2.确定递推公式
可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。
一定是选最小的,所以dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
注意这里为什么是加cost[i],而不是cost[i-1],cost[i-2]之类的,因为题目中说了:每当你爬上一个阶梯你都要花费对应的体力值
3.dp数组如何初始化
根据dp数组的定义,dp数组初始化其实是比较难的,因为不可能初始化为第i台阶所花费的最少体力。
那么看一下递归公式,dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。
vector<int> dp(cost.size());
dp[0] = cost[0];
dp[1] = cost[1];
4.确定遍历顺序
因为是模拟台阶,而且dp[i]又dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
5.举例推导dp数组
下标i 0 1 2 3 4 5 6 7 8 9
dp[i] 1 100 2 3 3 103 4 5 104 6
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size());
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < cost.size(); i++) {
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
}
// 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值
return min(dp[cost.size() - 1], dp[cost.size() - 2]);
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
2.优化
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int dp0 = cost[0];
int dp1 = cost[1];
for (int i = 2; i < cost.size(); i++) {
int dpi = min(dp0, dp1) + cost[i];
dp0 = dp1; // 记录一下前两位
dp1 = dpi;
}
return min(dp0, dp1);
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
边栏推荐
- 代码敲累了,停一下,来欣赏下顶级配色~
- Make clear the "program app and page" in wechat applet
- Code=6 'The connection has timed out unexpectedly
- [Yunxiang book club issue 13] Chapter 1 multimedia processing tools ffmpeg tool set
- EasyGBS平台出现录像无法播放并存在RTMP重复推流现象,是什么原因?
- Detailed explanation of inception audit rules
- Explanation of contract quantification system development roadmap
- Exploration of domestic system operation applet - Tongxin UOS
- go :gin BasicAuth中间件
- Configuration SSL MySQL 5.6 / 5.7
猜你喜欢

【Flutter】flutter doctor报错

用canvas画圆形雷达图
![[excel]解决Excel和txt转换出现的“问题](/img/06/d81356d3128f52a4d43916e1938c13.png)
[excel]解决Excel和txt转换出现的“问题

Kotlin协程分析(二)——suspendCoroutineUninterceptedOrReturn

VSCode代码风格笔记(Vetur)

微信小程序订阅消息开发流程

手写数字代码识别(pytorch)实现
![[19:00 on July 25] Quanguo fund product roadshow: investment in Taoyuan, China](/img/4b/b8f1cdfb379908adf2d1e30864fcb5.jpg)
[19:00 on July 25] Quanguo fund product roadshow: investment in Taoyuan, China

How does the rendering layer and logic layer of wechat applet work?

微信小程序页面的基本布局方法——flex布局
随机推荐
Jetpack原理剖析第二集(ViewModel篇)
WXSS 样式简明教程
7 steps of establishing knowledge base
CososCreator升级gradle版本
AS巧用IDEA注释,提高协作/开发效率
Huawei cloud gaussdb (for redis) unveiling issue 23: save portraits with gaussdb (for redis), and the recommended business can easily reduce the cost by 60%
Configure openstack GPU pass through
有手就会—如何将小程序一键打包生成App
Innobackupex installation
If you sort the error according to the creation time field according to the framework customer management, the solution is to report an error
Jetpack原理剖析第三集(Lifecycle篇)
【经典卷积网络】ResNet理论讲解
FinClip 小程序生态构建能力升级,实现企业个性化UI定制自由
JQ realizes multiple switching effects without affecting each other
WXS 语法参考-WXS模块
【yum】yum 源的配置与使用
微信小程序订阅消息开发流程
CDH 6.3.2 offline deployment
自定义炫酷效果ViewPage指示器
Mysql database record summary