LeetCode 746. 使用最小花费爬楼梯 C/C++/Python——动态规划

简介: LeetCode 746. 使用最小花费爬楼梯 C/C++/Python——动态规划

题目描述

给你一个整数数组 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

思路

动态规划 递推公式

首先,到达第n阶台阶有两种方式

  • 1.由n-1阶台阶,前进一步到达 - 花费为前面花费总和加上第n-1阶的花费: sum(n-1)+cur(n-1)
  • 2.由n-2阶台阶,前进两步到达 - 花费为前面花费总和加上第n-2阶的花费: sum(n-2)+cur(n-2)
    所以,第n阶最小花费应取二者较小值
    sum(n) = min(sum(n-1)+cur(n-1), sum(n-2)+cur(n-2))

C语言版

int minCostClimbingStairs(int* cost, int costSize) {
  int i = 0;
  int num1 = 0;
  int num2 = 0;
  int num3 = 0;
  if (costSize < 2)
  {
    return fmin(cost[0], cost[1]);
  }
  for (i = 2; i <= costSize; i++)
  {
    num3 = fmin(num1 + cost[i - 2], num2 + cost[i - 1]);
    num1 = num2;
    num2 = num3;
  }
  return num3;
}

C++版

//746_使用最小花费爬楼梯
/* 动态规划  递推公式
首先,到达第n阶台阶有两种方式
 - 1.由n-1阶台阶,前进一步到达 - 花费为前面花费总和加上第n-1阶的花费: sum(n-1)+cur(n-1)
 - 2.由n-2阶台阶,前进两步到达 - 花费为前面花费总和加上第n-2阶的花费: sum(n-2)+cur(n-2)
 所以,第n阶最小花费应取二者较小值
 sum(n) = min(sum(n-1)+cur(n-1), sum(n-2)+cur(n-2))
*/
class Solution {
public:
  int minCostClimbingStairs(vector<int>& cost) {
    if (cost.size() < 2)
    {
      return min(cost[0], cost[1]);
    }
    vector<int> ret;
    ret.push_back(0);
    ret.push_back(0);
    for (int i = 2; i <= cost.size(); i++)
    {
      ret.push_back(min(ret[i - 1] + cost[i - 1], ret[i - 2] + cost[i - 2]));
    }
    return ret[cost.size()];
  }
};
//优化空间复杂度
class Solution {
public:
  int minCostClimbingStairs(vector<int>& cost) {
    if (cost.size() < 2)
    {
      return min(cost[0], cost[1]);
    }
    int num1 = 0, num2 = 0, num3 = 0;
    for (int i = 2; i <= cost.size(); i++)
    {
      num3 = min(num1 + cost[i - 2], num2 + cost[i - 1]);
      num1 = num2;
      num2 = num3;
    }
    return num2;
  }
};

Python版

#746_使用最小花费爬楼梯
'''
 动态规划  递推公式
首先,到达第n阶台阶有两种方式
 - 1.由n-1阶台阶,前进一步到达 - 花费为前面花费总和加上第n-1阶的花费: sum(n-1)+cur(n-1)
 - 2.由n-2阶台阶,前进两步到达 - 花费为前面花费总和加上第n-2阶的花费: sum(n-2)+cur(n-2)
 所以,第n阶最小花费应取二者较小值
 sum(n) = min(sum(n-1)+cur(n-1), sum(n-2)+cur(n-2))
'''
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        if len(cost) < 2:
            return min(cost)
        dp = list()
        dp.append(0)
        dp.append(0)
        for i in range(2, len(cost) + 1):
            dp.append(min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]))
        return dp[len(cost)]
#优化空间复杂度    
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
    if len(cost) < 2:
            return min(cost)
        num1 = 0
        num2 = 0
        for i in range(2, len(cost) + 1):
            num3 = min(num2 + cost[i - 1], num1 + cost[i - 2])
            num1 = num2
            num2 = num3
        return num2


相关文章
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
231 0
|
1月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
36 1
WK
|
2月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
74 1
|
3月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
25 2
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
50 3
|
3月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
26 1
|
3月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
30 1
|
3月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
25 1
|
3月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
32 0
【Leetcode刷题Python】73. 矩阵置零