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月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2
|
5月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
393 0
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
65 2
|
3月前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
114 3
|
3月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
58 1
|
3月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
|
3月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
WK
|
4月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
108 1
|
5月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
38 2