当前位置: 首页 > news >正文

leetcode :746使用最小花费爬楼梯

746. 使用最小花费爬楼梯

题目链接https://leetcode.cn/problems/min-cost-climbing-stairs/

题目描述

给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 个台阶爬到 i+1 个台阶的费用。每次你可以选择爬一个台阶或两个台阶。你需要支付一定的费用才能爬到楼梯的顶部,求使得总费用最小的方案。

你可以从下标为 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 。

题目解法

我们根据描述可以观察到,到达第i个台阶的最优方案是从第i-1个台阶爬到第i个台阶,或者从第i-2个台阶爬到第i个台阶。因此,我们可以用动态规划来解决这个问题。

设dp[i]表示到达第i个台阶的最低花费,则有如下递推式:

dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])

即,如果从第i-1个台阶爬到第i个台阶的花费更低,则从第i-1个台阶爬到第i个台阶;否则,从第i-2个台阶爬到第i个台阶。

初始条件:

dp[0] = 0
dp[1] = 0

答案即为dp[n],其中n为cost数组的长度。

我们可以省略数组,用两个变量left和right来代替,left表示从第i-2个台阶爬到第i个台阶的最低花费,right表示从第i-1个台阶爬到第i个台阶的最低花费。

则有如下递推式:

left = right
right = min(left + cost[i-2], right + cost[i-1])

即,如果从第i-2个台阶爬到第i个台阶的花费更低,则从第i-2个台阶爬到第i个台阶;否则,从第i-1个台阶爬到第i个台阶。

复杂度分析

时间复杂度:O(n),其中n为cost数组的长度。

空间复杂度:O(1)。

代码实现

C++实现:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();int left=0,right=0,next;for(int i=2;i<=n;i++){next=min(left+cost[i-2],right+cost[i-1]);left=right;right=next;}return right;}
};

GO实现:

func minCostClimbingStairs(cost []int) int {n := len(cost)pre, cur := 0, 0for i := 2; i <= n; i++ {pre, cur = cur, min(cur+cost[i-1], pre+cost[i-2])}return cur
}

python实现:

class Solution(object):def minCostClimbingStairs(self, cost):""":type cost: List[int]:rtype: int"""pre,cur=0,0n=len(cost)for i in range(2,n+1):pre,cur=cur,min(pre+cost[i-2],cur+cost[i-1])return cur

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微软云技术深度解析与实战案例
  • 算法打卡——田忌赛马问题
  • (pycharm)安装python库函数Matplotlib步骤
  • 微服务架构设计模式简要介绍
  • 经验笔记:Spring Boot项目结构
  • Nacos注册中心与OpenFeign远程调用
  • PHP轻量级高性能HTTP服务框架 - webman
  • 【MATLAB】运算符及其优先级
  • sportbugs报告路径在linux和windows中的配置差异
  • 郑州建站网页手机版
  • 深度评测热门翻译工具,携手你的翻译得力助手
  • vim 安装与配置教程(详细教程)
  • Ubuntu构建只读文件系统
  • 【Python】数据可视化之分类图
  • 图像处理基础篇-镜像仿射透视
  • 《深入 React 技术栈》
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • JavaScript的使用你知道几种?(上)
  • Javascript设计模式学习之Observer(观察者)模式
  • Python学习之路13-记分
  • vue-cli3搭建项目
  • 代理模式
  • 订阅Forge Viewer所有的事件
  • 浮现式设计
  • 关于Flux,Vuex,Redux的思考
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端代码风格自动化系列(二)之Commitlint
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 听说你叫Java(二)–Servlet请求
  • 《天龙八部3D》Unity技术方案揭秘
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 数据库巡检项
  • ​Java基础复习笔记 第16章:网络编程
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #Linux(make工具和makefile文件以及makefile语法)
  • (C语言)fread与fwrite详解
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (备份) esp32 GPIO
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (七)Knockout 创建自定义绑定
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)appium-desktop定位元素原理
  • (转)关于多人操作数据的处理策略
  • (转)项目管理杂谈-我所期望的新人
  • (自适应手机端)行业协会机构网站模板
  • .gitignore不生效的解决方案
  • .NET : 在VS2008中计算代码度量值
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net接口调试与案例
  • .NET连接数据库方式