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

devtools/2024/9/22 19:48:38/

题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

话不多说,开始我们的新篇章吧。

题目思路:

直接按照dp五部曲走。

1.确定dp数组和i下标的含义。

该题要求我们返回楼梯顶部的最低花费。

那么dp[i]就是指到达第i个台阶的最低花费。

2.确定递推公式。

爬楼梯只能选择一步和俩步。那么本阶台阶只能由前一个台阶或前俩个台阶得到。也就是dp[i]只能由dp[i-1]和dp[i-2]得到。

那么此时我们再看dp数组的含义,dp[i]是到达第i个台阶的最低花费。

那么本阶台阶的最低花费只能由前一个台阶的最低花费加上他跳到本阶台阶所需要的花费和前俩个台阶的最低花费加上他跳到本阶台阶所需要的花费取一个最小值。即dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);

肯定会有人疑惑为什么要加上cost[i-1]或者cost[i-2]?

因为cost[i]定义的就是从i阶楼梯往上爬所需要的花费,所以就需要加上cost[i]。

3.dp的初始化。

题意为你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

就说明在0和1时你的最小花费其实是0,只要你从0和1开始往上爬时,才加上cost[i]。

dp[0] = 0,dp[1] = 0.

4.dp遍历顺序。

其实dp的初始顺序可以有递推公式看出来,每一个台阶的最小花费是由它前一个和前俩个台阶取最小值得出。即需要他前面台阶的数值。

所以本题就是从前往后遍历,这样才能保证当前台阶能够得到他前面台阶的值。

5.打印dp数组。

如果没有出现差错,我们就可以不用打印,因为我是写题解,所以我就不添加核心代码以外的代码,不然代码显的有些冗余。

举个例子。

在这里插入图片描述

以上五步都做完,那么此题的代码就可以写出来了。

最终代码:

java">class Solution {public int minCostClimbingStairs(int[] cost) {//其实本题就是在前俩个楼梯中选择一个最小花费的爬梯方式//1.dp数组的定义以及i下标的含义 该题是第i的楼梯所用的最小花费int dp[] = new int [cost.length + 1];//dp[i - 1] + cost[i - 1]意思是 当前当前楼梯的最小花费加上从该楼梯继续向上跳的花费//2.确认递推公式 dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);if(cost.length == 2)return Math.min(cost[0],cost[1]);//站在0和1台阶上不花费 只有往上跳的时候才花费//3.dp的初始化dp[0] = 0;dp[1] = 0;//4.确认dp的遍历顺序//5.打印dp数组 debug 这里我就不写了for(int i = 2;i <= cost.length;i ++){dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);}//楼梯的位置在cost数组的最后部分 即cost[length]return dp[cost.length];}
}  

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!


http://www.ppmy.cn/devtools/107219.html

相关文章

前端使用Mock的场景与具体使用方法

在现代前端开发中&#xff0c;Mock技术扮演着至关重要的角色。无论是开发初期、测试阶段&#xff0c;还是在进行复杂的前后端分离开发时&#xff0c;Mock都能极大地提高开发效率和代码质量。本文将深入探讨前端开发中使用Mock的常见场景&#xff0c;并详细介绍具体的使用方法。…

uniapp底部安全距离(safeAreaInsets)的实际应用

实际遇到的问题&#xff1a;页面底部的元素与 IOS 自带的导航条重叠了&#xff08;图 1&#xff09;&#xff0c;调整后&#xff08;图 2&#xff09; 解决办法&#xff1a;safeAreaInsets获取屏幕边界到安全区域距离 // 获取屏幕边界到安全区域距离 const { safeAreaInset…

java重点学习-redis

一.redis 穿透无中生有key&#xff0c;布隆过滤nul隔离 锁与非期解难题。缓存击穿过期key&#xff0c; 雪崩大量过期key&#xff0c;过期时间要随机。 面试必考三兄弟&#xff0c;可用限流来保底。 1.1 Redis的使用场景 根据自己简历上的业务进行回答 缓存穿透、击穿、雪崩、双…

SprinBoot+Vue在线商城微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

代码随想录 -- 二叉树 -- 二叉树的迭代遍历

前序 遍历顺序为中左右&#xff0c;定义一个栈 stack&#xff0c;一个数组 res 存放最终结果。 注意&#xff1a;由于栈是后进先出&#xff0c;所以要按照右左来进栈。 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; class Solution(object):def preorder…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第八篇:Tab标签页的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

任务栏透明怎么设置?四款win11任务栏透明软件,设计师必备!(2024新)

在使用win11的过程中&#xff0c;很多用户都希望能够让自己的桌面不仅仅是一个工作空间&#xff0c;而是一个能够反映其个性与审美的地方。特别是对于设计师、创作者或是桌面美化爱好者而言&#xff0c;干净利落的任务栏能大大提升工作效率和创造力。当任务栏透明化时&#xff…

掌握MySQL:数据库建模与ER图设计指南

掌握 MySQL&#xff1a;数据库建模与 ER 图设计指南 在现代软件开发中&#xff0c;数据库建模是设计和实现数据驱动型应用程序的关键步骤之一。通过数据库建模&#xff0c;我们能够更好地组织数据、提高数据的存储效率、增强数据的完整性和一致性。在 MySQL 环境下&#xff0c…