力扣第746题 使用最小花费爬楼梯 c++ 动态规划

题目

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 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

思路和解题方法

  1. 首先,获取cost数组的大小,即台阶的数量。
  2. 然后,创建一个大小为n+1的数组dp,用于保存到达每个台阶的最小花费。数组的下标表示台阶的编号,数组的值表示到达该台阶的最小花费。
  3. 接着,对于前两个台阶(下标为0和1),将它们的最小花费初始化为0,因为从这两个台阶起步不需要花费。
  4. 然后,使用动态规划的思想计算到达每个台阶的最小花费。从第2个台阶开始遍历到第n个台阶,在每次循环中,将到达前一个台阶和到达前两个台阶的最小花费加上当前台阶的花费,取较小值赋给当前台阶的最小花费,即dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
  5. 最后,返回到达最后一个台阶的最小花费,即dp[n]

复杂度

时间复杂度:

O(n)

时间复杂度为O(n),其中n是台阶的数量,因为需要遍历从第3个台阶到第n个台阶,每次计算都需要常数时间。

空间复杂度

O(n)

空间复杂度为O(n),因为创建了一个大小为n的数组dp来保存到达每个台阶的最小花费。

c++ 代码

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        // 获取cost数组的大小
        int n = cost.size();
        
        // 创建一个大小为n+1的数组dp,用于保存到达每个台阶的最小花费
        vector<int> dp(n+1);
        
        // 初始化前两个台阶的最小花费为0
        dp[0] = 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];
    }
};

附上常数空间代码

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        // 初始化dp0和dp1为到达前两个台阶的最小花费,初始值均为0
        int dp0 = 0;
        int dp1 = 0;
        
        // 使用动态规划的思想计算到达每个台阶的最小花费
        for (int i = 2; i <= cost.size(); i++) {
            // 计算到达当前台阶的最小花费
            int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);
            
            // 更新dp0和dp1的值,将dp1的值作为下一次循环中的dp0,将dpi的值作为下一次循环中的dp1
            dp0 = dp1; // 记录一下前两位
            dp1 = dpi;
        }
        
        // 返回到达最后一个台阶的最小花费,即dp1
        return dp1;
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦 >人< 。

相关推荐
hsling松子1 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
家有狸花2 小时前
VSCODE驯服日记(三):配置C++环境
c++·ide·vscode
dengqingrui1232 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝2 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O3 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King3 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家3 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain3 小时前
算法 | 位运算(哈希思想)
算法
小飞猪Jay5 小时前
C++面试速通宝典——13
jvm·c++·面试
Kalika0-05 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法