LeetCode算法心得——使用最小花费爬楼梯(记忆化搜索+dp)

大家好,我是晴天学长,很重要的思想动规思想,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1)使用最小花费爬楼梯

在这里插入图片描述

给你一个整数数组 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


2) .算法思路

  • 有点像变了的样子的打家劫舍,可以打劫附近的房子了。

3) .算法步骤

定义一个整型数组 memo 和 cost,用于存储记忆化搜索的结果和每个楼梯的代价。
创建 minCostClimbingStairs 方法来启动算法。在该方法中,初始化 memo 数组和 cost 数组,并将 memo 数组的所有元素初始化为 -1。
调用 dfs 方法,将起始索引设为 cost.length - 1(最后一个楼梯),并返回从最后一个楼梯开始上楼梯的最小代价。
在 dfs 方法中,首先检查是否已经搜索过当前索引 i 的结果。如果在 memo 数组中存在已计算的值,则直接返回该值作为结果,避免重复计算。
如果当前索引 i 小于 0,表示已经超出楼梯范围,返回 0。
否则,根据动态规划的思想,当前楼梯 i 的最小代价等于从前一个楼梯 i-1 或者前两个楼梯 i-2 上来的最小代价加上当前楼梯的代价。使用递归调用 dfs 方法,分别计算从 i-1 楼梯和 i-2 楼梯上来的最小代价,并将它们与当前楼梯的代价相加并取最小值。
将计算得到的结果存储在 memo 数组中,以备后续使用。
返回当前索引 i 的结果作为最终答案,即从最后一个楼梯出发的最小代价。


4).代码示例

方法1:记忆化搜索。class Solution {int[] memo;int[] cost;public int minCostClimbingStairs(int[] cost) {memo = new int[1000];this.cost = cost;Arrays.fill(memo, -1);return Math.min(dfs(cost.length - 1), dfs(cost.length - 2));}//变相的打家劫舍, 到楼梯发现已经爬上来了,不能选择不爬private int dfs(int i) {if (i < 0) return 0;if (memo[i] != -1) return memo[i];int result = Math.min(dfs(i - 1) + cost[i], dfs(i - 2) + cost[i]);memo[i] = result;return result;}}
方法2:动态规划dp
//感兴趣的小伙伴可以用一个数组来打表,优化空间复杂度。class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length];dp[0] = cost[0];dp[1] = cost[1];for (int i = 2; i < dp.length; i++) {dp[i] = Math.min(dp[i - 1] + cost[i], dp[i - 2] + cost[i]);}return Math.min(dp[cost.length - 1], dp[cost.length - 2]);}}

5).总结

  • 状态转移思想。

试题链接:

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

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

相关文章

PTA-使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。 函数接口定义&#xff1a; int gcd( int x, int y ); 其中x和y是两个正整数&#xff0c;函数gcd应返回这两个数的最大公约数。 裁判测试程序样例&#xff1a; #include <stdio.h> int gcd( int x, int y ); i…

【数据结构】深入浅出理解链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

render函数举例

在这段代码中&#xff0c;renderButton是一个对象吗 还有render为什么不能写成render() {} 代码原文链接 <template><div><renderButton /></div> </template><script setup> import { h, ref } from "vue"; const renderButt…

C#,简单修改Visual Studio 2022设置以支持C#最新版本的编译器,尊享编程之趣

1 PLS README & CHAPTER 5 用一个超简单的例子说明各版本 C# 的差异。 使用新版本&#xff08;比如C#.11&#xff09;&#xff0c;当然有一定的好处。我们在写程序的时候一般这样&#xff1a; Visual Studio 2022 默认只能这样写&#xff1a; string imageFile Path.C…

若依框架参数验证

文章目录 一、前端触发参数校验异常1.前端页面2.前端代码 二、后端触发参数校验异常1.前端页面2.后端报错 三、后端自定义参数验证1.添加注解2.触发后端校验 一、前端触发参数校验异常 1.前端页面 输入不符合校验规则的值来触发 2.前端代码 校验规则数组 表单的元素 修…

SQL Server数据库备份与还原

目录 SQL Server DataBase备份 SQL Server DataBase还原 SQL Server DataBase备份 在 SQL Server 中&#xff0c;你可以使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 语句来手动备份数据库。以下是两种方法&#xff1a; 使用 SQL Server Management Studio (SS…

JAVA小游戏“飞翔的小鸟”

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; 代码如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width…

Windows下安装Anaconda3并使用JupyterNoteBook

下载安装包 Anaconda官网 进官网&#xff0c;点击下载 自动根据当前系统下载对应的包了&#xff0c;安装包大约1G&#xff0c;喝杯Java耐心等待。 安装 很多人安装C盘&#xff0c;我这里放D盘。 注意&#xff1a;你的文件夹目录一定要不能有空格 然后其他的直接默认install即…

不同路径 递归

int dfs(int i, int j, int m, int n) { if (i > m || j > n) return 0; // 越界了 if (i m && j n) return 1; // 找到一种方法&#xff0c;相当于找到了叶子节点 return dfs(i 1, j, m, n) dfs(i, j 1, m, n); } int u…

在线视频课程教育系统源码/网课网校/知识付费/在线教育系统/在线课程培训系统源码

源码简介&#xff1a; 在线视频课程教育系统源码&#xff0c;作为网课/网校/知识付费/在线教育系统&#xff0c;它有文章付费阅读在线点播自动发货付费阅读VIP会员系统等功能。它是实用的在线课程培训系统源码。 发货100-在线视频课程教育系统&#xff0c;它是一款功能实用的…

优思学院|2024年质量管理的大趋势

2023年我们已经顺利度过了整年的大部分时间&#xff0c;2024年质量管理的趋势和问题在全球范围内都已经引起了关注&#xff0c;或者仍然是企业导航的首要任务。 1. 通货膨胀与质量管理 2023年&#xff0c;全球范围内通货膨胀和严峻的经济状况成为企业最关心的问题之一。尽管物…

Flash可更换声音语音芯片WT588F02系列:优势尽显,应用广泛

在语音技术日益普及的今天&#xff0c;唯创知音推出的Flash可更换声音语音芯片WT588F02系列备受关注。该系列芯片凭借其强大的性能与广泛的应用领域&#xff0c;成为市场上的一颗璀璨明星。本文将分析WT588F02系列的优势&#xff0c;并探讨其应用场景&#xff0c;以展现其在语音…

typedef 的使用

typedef 的定义 typedef 是 C 和 C 中的一个关键字&#xff0c;用于给已有类型定义一个新的名字&#xff0c;与 class、struct、union 和 enum 声明不同&#xff0c;typedef 声明不引入新类型&#xff1b;它们引入现有类型的新名称 typedef 的语法格式 typedef existing_typ…

gitlab 12升级14(解决各种报错问题)

1.这里是从自己公司的源下载的rpm包&#xff0c;需要换成自己的 2.从12的最后一个版本升级到14的最后一个版本 # 停服务 [rootdocker test]# gitlab-ctl stop puma && gitlab-ctl stop sidekiq && gitlab-ctl stop nginx && gitlab-ctl status# 进入…

前端如何判空

这样判空就会报错 loadNode(node, resolve)console.log("node")console.log(node)if (node.data ! null) {this.get(ctx /publicity/publicityType/typeTreeData?id node.data.id).then((res) > {resolve(res)})}}, 需要这样写&#xff0c;用typeof来做类型判…

【webrtc】ModuleRtpRtcpImpl2: RtpRtcp DEPRECATED_Create 废弃了

基于m98 代码。Deprecate the static RtpRtcp::Create() method. 提交记录RtpRtcp::Create factory method 工厂方法废弃了。std::unique_ptr<RtpRtcp> RtpRtcp::DEPRECATED_Create(const Configuration& configuration) {RTC_DCHECK

java 实现发送邮箱,复制即用,包含邮箱设置第三方登录授权码获取方法

application.yml spring:profiles:active: dev # active: test#邮件附件上传文件大小限制servlet:multipart:max-file-size: 50MB #单个文件大小限制max-request-size: 100MB #总文件大小限制&#xff08;允许存储文件的文件夹大小&#xff09;mail:default-encoding: UTF…

【开题报告】基于SpringBoot的机车模型交流平台的设计与实现

1.研究背景 机车模型是一种受到广泛关注的模型制作爱好&#xff0c;它涵盖了机车模型的收藏、展示、制作等多个方面。然而&#xff0c;由于机车模型爱好者的数量较少&#xff0c;且分散在不同的地区和社区&#xff0c;导致他们难以进行互动和资源共享。因此&#xff0c;需要一…

COBOL排序问题

*SORT排序文件文件超长&#xff0c;将主键保存在临时文件里&#xff0c;超长的数据从数组里面去检索获取。 IDENTIFICATION DIVISION. PROGRAM-ID. TEST002. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. …

YOLOv5改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 💡💡💡Yolov5/Yolov7魔术师,独家首发创新(原创),适用于…