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

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/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+1dp[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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/318583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】函数

函数是什么&#xff1f; “函数”是我们早些年在学习数学的过程中常见的概念&#xff0c;简单回顾一下&#xff1a;比如下图中&#xff0c;你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

AD教程 (二十四)PCB走线

AD教程 &#xff08;二十四&#xff09;PCB走线 信号层进行走线&#xff0c;对于信号走线尽量少打孔 电源层进行平面分割&#xff0c;电源层主要考虑载流&#xff0c;不太考虑信号的干扰 顶层不方便走线的可以在顶层打孔到底层走线&#xff0c;但是能少打孔就少打孔 交互式总…

因遭受“重大 DDoS 攻击”,官网及服务一度封停或崩溃

1月2日最新消息&#xff0c;Atomicals Market在社交媒体上发文表示&#xff0c;正遭受DDoS攻击&#xff0c;如果网站显示已被封锁&#xff0c;用户请勿担心。团队正在努力解决该问题&#xff0c;预计很快将会恢复正常。 开源建模软件 Blender 11月底也曾多次遭受严重 DDoS 攻击…

成为比开发硬气的测试人,我都经历了什么?

我的职业生涯很简单&#xff0c;可以说&#xff0c;我的测试生涯就是我的职业生涯。 大学的专业是计算机&#xff0c;当年是热门的学科&#xff0c;但自己的计算机知识不强悍&#xff0c;又加上学校的硬核是金融业&#xff0c;来学校校招的都是各大银行&#xff0c;且都是需要…

【Matlab】PSO-BP 基于粒子群算法优化BP神经网络的数据时序预测(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88689096 目录 【Matlab】BP 神经网络时序预测算法 【Matlab】CNN卷积神经网络时序预测算法 【Matlab】ELM极限学习机时序预测算法 【Matlab】基于遗传算法优化BP神经网络 (GA-BP)的数据时序预测 【Mat…

单机游戏数据自动保存方案

引言 单机游戏数据的自动保存方案 大家好&#xff0c;2023年还有最后的3天&#xff01; 有小伙伴私信我&#xff0c;说: 总感觉一股脑的全盘定时保存不科学&#xff0c;也写过保存变化的玩家数据&#xff0c;但是改完数据就得手动标记一下字段变化&#xff0c;感觉不够智能&…

SpringBoot项目的三种创建方式

手动创建方式&#xff1a; ①&#xff1a;新建maven项目 ②&#xff1a;引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.10.RELEASE</version>&l…

学习Go语言Web框架Gee总结--上下文Context(二)

学习Go语言Web框架Gee总结--上下文Context context/go.modcontext/main.gocontext/gee/context.gocontext/gee/router.gocontext/gee/gee.go 学习网站来源&#xff1a;Gee 项目目录结构&#xff1a; context/go.mod module examplego 1.21.5require gee v0.0.0 replace gee…

电子邮件营销主题管理技巧:提升邮件打开率与转化率的实用指南

有效的沟通在于向正确的受众传递正确的信息。市场营销人员大部分时间都在寻找最佳方式。幸运的是&#xff0c;我们无需耗费太多精力才能找到答案。为什么不直接问问你的受众他们期望的是什么&#xff0c;然后根据他们的需求进行沟通呢&#xff1f; 由于社交媒体的出现&#xf…

B端产品经理学习-B端产品系统调研的工具

系统性调研目标的工具 系统性调研的目标 相对于背景调研&#xff0c;系统行调研是对公司可控因素&#xff08;公司内部&#xff09;和直接作用力&#xff08;消费者、竞争者&#xff09;进行的调研。系统性调研需要输出结论&#xff0c;为达成产品或公司的战略目标而制定行动的…

【CVPR2023】使用轻量 ToF 传感器的单目密集SLAM的多模态神经辐射场

目录 导读 本文贡献 本文方法 轻量级ToF传感器的感知原理 多模态隐式场景表示 时间滤波技术 实验 实验结果 消融实验 结论 未来工作 论文标题&#xff1a;Multi-Modal Neural Radiance Field for Monocular Dense SLAM with a Light-Weight ToF Sensor 论文链接&am…

Reids在Win下无法远程访问

1.将redis在windows上启动主要做了以下配置 1.1.在redis.windows.conf中修改一下 原&#xff1a;bind 127.0.0.1 改&#xff1a;# bind 127.0.0.1 bind 0.0.0.0 原&#xff1a;protected-mode yes 改&#xff1a;protected-mode no去掉了127.0.0.1&#xff0c;加入0.0.0.0后&…