java数据结构与算法刷题-----LeetCode746. 使用最小花费爬楼梯

Java实现 LeetCode 746 使用最小花费爬楼梯(递推) 746. 使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。 您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。 示例 1: 输入: cost = [10, 15, 20] 输出: 15 解释: 最低花费是从c... 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只不过大家都叫它dp),达到空间换时间的效果。它仅仅只是一种优化思路,因此它目前的境地和线性代数一样----虚假的难。

  1. 想想线性代数,在国外留学的学生大多数不觉得线性代数难理解。但是中国的学生学习线性代数时,完全摸不着头脑,一上来就是行列式和矩阵,根本不知道这玩意是干嘛的。
  2. 线性代数从根本上是在空间上研究向量,抽象上研究线性关系的学科。人家国外的教科书都是第一讲就帮助大家理解研究向量和线性关系。
  3. 反观国内的教材,直接把行列式搞到第一章。搞的国内的学生在学习线性代数的时候,只会觉得一知半解,觉得麻烦,完全不知道这玩意学来干什么。当苦尽甘来终于理解线性代数时干什么的时候,发现人家国外的教材第一节就把这玩意讲清楚了。你只会大骂我们国内这些教材,什么狗东西(以上是自己学完线性代数后的吐槽,我们同学无一例外都这么觉得)。

而我想告诉你,动态规划和线性代数一样,我学完了才知道,它不过就是研究空间换时间,提前将固定的重复操作规划到dp数组中,而不用暴力求解,从而让效率极大提升。

  1. 但是网上教动态规划的兄弟们,你直接给一个动态方程是怎么回事?和线性代数,一上来就教行列式和矩阵一样,纯属恶心人。我差不多做了30多道动态规划题目,才理解,动态方程只是一个步骤而已,而这已经浪费我很长时间了,我每道题都一知半解不理解,过程及其痛苦。最后只能重新做。
  2. 动态规划,一定是优先考虑重复操作与dp数组之间的关系,搞清楚后,再提出动态方程。而你们前面步骤省略了不讲,一上来给个方程,不是纯属扯淡吗?
  3. 我推荐研究动态规划题目,按5个步骤,从上到下依次来分析
  1. DP数组及下标含义
  2. 递推公式
  3. dp数组初始化
  4. 数组遍历顺序(双重循环及以上时,才考虑)
  5. dp数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

在这里插入图片描述

先理解题目细节

在这里插入图片描述

  1. cost数组是离开每层楼梯向上爬所需体力,没有记录顶层,因为已经顶层了,没有比它搞一层的了,自然没有向上爬需要的体力。而我们要的是,到达顶层,需要的最小体力。
  2. 初始可以站在0号或1号位置,所以到达0和1号位置所需体力为0
  3. 每次要么攀登1层,要么攀登两层
  4. 之后的每一层,若想到达,需要花费的体力为:从上一个攀登的楼梯“x”离开所需体力(cost数组中的值)+ 到达“x”已经花费的体力
  5. 因为我们只需要最小的体力花费,所以只记录较小的值。
解题思路
  1. 暴力求解的思想,就是回溯算法,枚举每一种情况,拿到最小值,显然会做大量无效运算。
  2. 但是如果我们预先将其存储到dp数组,就可以直接通过dp[x], 获取dp数组中指定位置x的体力花费,而不用枚举。典型的动态规划题目
动态规划思考5步曲
  1. DP数组及下标含义

我们要求出的是最小体力花费,那么dp数组中存储的就是最小体力花费。要求出谁的最小体力花费就是下标的含义。显然是攀登到每层台阶的,那么下标就是代表谁的体力花费,也就是代表是哪一层楼梯的体力花费。显然,只需要一个下标即可表示,故这道题的dp数组只需要一维数组

  1. 递推公式
  1. 由题意可知,初始可以从0或1层开始,所以攀登到0或1所需体力花费为0.F(0) = F(1) = 0.
  2. 之后每一层,都需要判断它的前两层,到这一层的花费,谁更小。花费(从下面这两层到当前层X的花费)为:从下面两层离开所需的花费(cost中的值,因为要从它离开,到这个X层)+ 到达这两层本身已经花费的体力(到达下面那两层也是需要体力的)。也就是 F(n-1)+cost[n-1] 和 F(n-2)+cost[n-2]为到达X的两种方案花费。
  3. 因此,可以得到,从第二层开始,递推公式为前两层到它所需花费,且只考虑最小的那个 : F(n) = min( F(n-1)+cost[n-1] , F(n-2)+cost[n-2] )
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序(因为这个数列是一维的,只需要一重循环,无需考虑这个)
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

代码:时间复杂度O(n).空间复杂度O(n)

在这里插入图片描述

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int length = cost.length;//cost的长度,不包含顶层。因为它记录的是从每一层向上爬所需体力,顶层不需要再爬
        //dp数组保存到达每一层的花费,一维数组即可,下标代表是哪一层
        int dp[] = new int[length+1];//而dp数组中需要记录到达顶层所需要的花费因此长度为length+1
        dp[0]=dp[1] = 0;//dp数组保存到达每次的花费,而我们是从0或1层才刚刚开始攀登,到达这两层,无需体力开销,都是0。
        for(int i = 2;i<=length;i++){//剩下每一层,因为每次只能攀登1或2层。只需考虑两种情况
            //选择前两层到它的最小开销,每个开销为,从自己离开需要的花费+到达自己已经用的体力
            dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[length];
    }
}
学有余力的同学可以尝试这个方法,将空间复杂度变为常数级-----------------代码:时间复杂度O(n).空间复杂度O(1)

将dp数组优化掉,换成3个变量,滚动执行。将dp[0]换成prev。dp[1]换成curr,dp[2]换成next。也就是prev始终指向 i-2的位置。curr指向i-1. next指向i
在这里插入图片描述

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int length = cost.length;//cost的长度,不包含顶层。因为它记录的是从每一层向上爬所需体力,顶层不需要再爬
        //dp数组保存到达每一层的花费,一维数组即可,下标代表是哪一层
        int prev = 0,curr = 0;
        for(int i = 2;i<=length;i++){//剩下每一层,因为每次只能攀登1或2层。只需考虑两种情况
            //选择前两层到它的最小开销,每个开销为,从自己离开需要的花费+到达自己已经用的体力
            int next = Math.min(curr+cost[i-1],prev+cost[i-2]);
            prev = curr;
            curr = next;
        }
        return curr;
    }
}
避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活 本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。 阅读详情

相关推荐

攻克+86手机号Discord验证墙:从“无效”到“成功”的实战指南

本文提供了一份针对+86手机号在Discord注册时频繁遭遇“手机号无效”问题的实战解决指南。文章系统分析了问题根源,并分步详解了从打造纯净网络环境、尝试多种手机号格式(如+86前加0),到更换iOS等客户端设备的有效方法,旨在帮助用户成功完成Discord手机号验证。

mac99的博客 1129

刷leetCode需要掌握的一些数据结构---JAVA篇

基本数据结构一览 1.Collection接口 Collection是最基本的集合接口,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。这个接口有两个基本方法: public interface Collection<E>{ boolean add(E element); Iterator<E> iterator(); ... } 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个it

松落 1383

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 424

leetcode中常用的简单数据结构(JAVA)

比如遍历时候当前为字母为'a'我们可以: map.put(map.getOrDefault('a', 0) + 1);// 查看栈是否为空,或者用stack.size() == 0。// 查看栈是否为空,或者用queue.size() == 0。(1) 定义 Map map = new HashMap();(1) 定义 Queue queue = new LinkedList();// 查看栈是否为空,或者用pq.size() == 0。

2401_84782585的博客 1379

树莓派4B网线直连Windows全流程:从IP查询到SSH登录避坑指南

本文提供了一份详细的树莓派4B通过网线直连Windows电脑的实战指南。核心步骤包括配置Windows网络共享、查询树莓派IP地址以及通过SSH进行安全登录与初始配置。文章深入解析了直连的网络原理,并重点分享了使用CMD命令和工具定位IP、避免常见错误的避坑技巧,帮助用户在没有显示器或路由器的环境下快速完成树莓派初始化。

grape的博客 1081

SAP FI 提示没有为会计年度0 定义版本2025 GP626

SAP 错误 GP626 是一个常见的系统消息,通常表示某个会计年度的版本(如版本 0)未被定义或未激活。:在执行某些事务(如创建采购订单、过账凭证或维护成本中心)时,系统会检查相关版本是否已定义。的“Settings for Each Fiscal Year”界面中,选择一个已激活的会计年度。的“Settings for Each Fiscal Year”界面中,找到未激活的会计年度。:在控制范围(Controlling Area)中,未为指定的会计年度定义版本 0。如果没有,添加或复制现有年度的设置。

GAVIN 2493

LeetCode中需要用到数据结构的各种方法(Java)

仅为自己查询方便使用

打球唔叻的博客 782

别再只飞不记了!用CsvView分析你的大疆飞行日志,优化航拍与排查炸机原因

本文详细介绍了如何利用CsvView工具分析大疆无人机的飞行日志,帮助用户优化航拍效率和飞行安全。通过解读飞行日志中的关键数据,如电池性能、飞行轨迹等,用户可以及时发现潜在问题并改进飞行习惯。文章还提供了事故排查方法和进阶分析技巧,适合无人机爱好者和专业飞手。

weixin_42535461的博客 551

Java-Leetcode 常用数据结构和函数

常用数据结构 LinkedList 实现了以下接口。 栈(Deque) 入栈 push(e) 获取栈顶 peek() 弹出栈顶 pop() 普通队列(Queue) 以下函数失败时前者抛出异常,后者返回特殊值,如 false、null等。 队尾添加元素 add(e)、offer(e) 获取队首元素 element()、peek() 弹出队首元素 remove()、poll() 双端队列(Deque) 队首插入元素 addFirst(e) 队尾插入元素 addLast(e) 获取队首元素 getFir

weixin_42946275的博客 804

不加行也能填满:用 ABAP BDC 驯服 Table Control 滚动录制缺陷,批量维护供应商银行账户

摘要 本文探讨了在SAP ECC/S4HANA系统中处理供应商主数据时,Table Control控件带来的批量导入挑战。文章指出,银行账户维护界面中Table Control的滚动动作难以被录制工具捕捉,导致批量导入数据时仅能填充前5行。解决方案是通过BDC_OKCODE显式触发翻页(如=P+),并配合行号拼接(如(01)~(05))将数据写入不可见行。文中提供了完整的ABAP程序示例,展示了如何读取外部文件、动态生成BDCDATA、处理表格翻页逻辑,最终通过CALL TRANSACTION执行XK01事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 277

【经验&技巧】IBIS AMI模型眼图仿真问题探讨

在ADS的仿真环境中,不论发送和接收的AMI模型是否为true或者false,都可以将通道仿真设置为统计模式,但是,如果有一方的Init函数为false,在统计模式下,处于false状态的模型将不能执行其自带的后处理功能,如下图所示,左边的统计模式和右边的逐比特模式眼图存在明显的差异,原因在于,接收端的init函数为false导致在统计模式中不能对眼图进行DFE处理,换言之,此时统计模式下的眼图就是未经任何处理的“生图”。

一只豌豆象的博客 1767

LeetCode必备:Java数据结构的常用方法

基础数据类型和字符串: 基础操作符 比如说+ == !=之类的 只能用于基础数据 类型和字符串能用。 而且尤其注意相比较两个对象的值只能用equals() 字符串的相关方法: String var.length(): int var.indexOf(“a”):int var.charAt(int index): char var.substring(int beginIndex): String var.substring(int beginIndex, int endIndex): String //包

Tech in Pieces 749

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信今天开始会陆续介绍一些优秀的开源项目,项目基本都是和FPGA或HDL相关的。对于一些找工作或者急需项目经验的人来说,这些项目...

OpenFPGA的博客 8120

【leetcode刷题】66.使用最小花费爬楼梯——Java版

dp

公号:一条coding 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【LeetCode每日一题】——746.使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。

IronmanJay 1583

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣746-使用最小花费爬楼梯(动态规划 Java版详细题解)

个人刷题思路总结整理。

ItDaChuang的博客 692

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

力扣746-使用最小花费爬楼梯(Java详细题解)

那么本阶台阶的最低花费只能由前一个台阶的最低花费加上他跳到本阶台阶所需要的花费和前俩个台阶的最低花费加上他跳到本阶台阶所需要的花费取一个最小值。即dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);也就是dp[i]只能由dp[i-1]和dp[i-2]得到。因为cost[i]定义的就是从i阶楼梯往上爬所需要的花费,所以就需要加上cost[i]。那么此时我们再看dp数组的含义,dp[i]是到达第i个台阶的最低花费。

2302_79761426的博客 583

代码随想录算法训练营Day37 | 509. 斐波那契数、70.爬楼梯、746. 使用最小花费爬楼梯

训练营第37天:509. 斐波那契数、70.爬楼梯、746. 使用最小花费爬楼梯

jiabao0520的博客 933

LeetCode、746. 使用最小花费爬楼梯【简单,动态规划 线性DP】

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。博客目录索引(持续更新)b站-Coder长路。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1166

【算法刷题day38】Leetcode:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

暂无暂无暂无509. 斐波那契数代码随想录解析70. 爬楼梯代码随想录解析746. 使用最小花费爬楼梯代码随想录解析。

qq_45022758的博客 565

【玩转动态规划专题】746. 使用最小花费爬楼梯【简单】

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。输入:cost = [1,100,1,1,1,100,1,1,100,1]你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。输入:cost = [10,15,20]请你计算并返回达到楼梯顶部的最低花费。解释:你将从下标为 1 的台阶开始。解释:你将从下标为 0 的台阶开始。dp[i] 表示到第i阶梯的最少花费。

sadsasdsdsdasda的博客 607

【LeetCode】746. Min Cost Climbing Stairs 使用最小花费爬楼梯(Easy)(JAVA)每日一题

【LeetCode】746. Min Cost Climbing Stairs 使用最小花费爬楼梯(Easy)(JAVA) 题目地址: https://leetcode.com/problems/remove-duplicate-letters/ 题目描述: On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay the cost, you can either c

qq_16927853的博客 215

746. 使用最小花费爬楼梯【动态规划】

746.使用最小花费爬楼梯 题目链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs/ 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值cost[i](下标从 0 开始)。 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。 请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。 示例1: 输入:cost = [..

coolshyman的博客 1704

leetcode746---使用最小花费爬楼梯

leetcode746—使用最小花费爬楼梯原题链接 过个年颓废这么久,写个简单题找找感觉先:)… 题意简述 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。 您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。 示例 1: 输...

Again的博客 218

代码随想录算法day28 | 动态规划算法part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、 746. 使用最小花费爬楼梯

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

m0_62415132的博客 1396

Leetcode刷题java之746. 使用最小花费爬楼梯

执行结果: 通过 显示详情 执行用时 :2 ms, 在所有Java提交中击败了97.20%的用户 内存消耗 :37.2 MB, 在所有Java提交中击败了88.69%的用户 题目: 数组的每个索引做为一个阶梯,第i个阶梯对应着一个非负数的体力花费值cost[i](索引从0开始)。 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。 ...

逆水行舟,不进则退 612
上一篇: java数据结构与算法刷题-----LeetCode70. 爬楼梯
下一篇: java数据结构与算法刷题-----LeetCode198. 打家劫舍
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值