【算法挨揍日记】day18——746. 使用最小花费爬楼梯、91. 解码方法

本文主要是介绍【算法挨揍日记】day18——746. 使用最小花费爬楼梯、91. 解码方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 746. 使用最小花费爬楼梯

746. 使用最小花费爬楼梯

题目描述: 

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

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

请你计算并返回达到楼梯顶部的最低花费。

 解题思路:

状态描述:我们可以直接将dp【i】 代表到达第i个台阶的最小费用

cost = [1,100,1,1,1,100,1,1,100,1]

以这个示例为例 

状态转移方程: 

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

初始化:dp【0】=0,dp【1】=0;

填表顺序:从左到右

返回值:dp【n】 

解题代码: 

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

91. 解码方法

91. 解码方法

题目描述:

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> "1"
'B' -> "2"
...
'Z' -> "26"

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

  • "AAJF" ,将消息分组为 (1 1 10 6)
  • "KJF" ,将消息分组为 (11 10 6)

注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

解题思路: 

 本题的状态表示是通过经验+题目要求得出的

状态表示:dp[i]代表以i位置结尾的所有解码方法总和

状态转移方程:

我们就观察以i位置结尾的数字串,此时有两种情况:

  • s[i]单独解码

  • s[i]和s[i-1]一起解码 

先说s【i】单独解码的情况,当解码成功时,也就是s【i】代表的数字属于【1,9】,则dp【i】+=dp【i-1】,失败的话就是0了

再来就是 s[i]和s[i-1]一起解码 的情况:当解码成功也就是这两个数字属于【10,26】,则dp【i】+=dp【i-2】,失败也是0

初始化:dp【0】当s【0】属于1-9,dp【0】=1,s【0】=0的话dp【0】=0

dp【1】的话,此时就有两个数字,就分为两种情况,两个数字分开单独解码和两个数字一起解码,单独解码的话s【1】代表的数字属于【1,9】,dp【1】++,两个数字一起解码的话,当解码成功也就是这两个数字属于【10,26】,则dp【1】++

填表顺序:从左导游

返回值;dp[n-1]

解题代码: 

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int>dp(n + 1, 0);//初始化if (s[0] >= '1' && s[0] <= '9')dp[0] = 1;else dp[0] = 0;if (n == 1)return dp[0];if (dp[0] && s[1] - '0')dp[1]++;int num = (s[0] - '0') * 10 + (s[1] - '0');if (num >= 10 && num <= 26)dp[1]++;for (int i = 2; i < n; i++){if (s[i] >= '1' && s[i] <= '9')dp[i] += dp[i - 1];num = (s[i - 1] - '0') * 10 + (s[i] - '0');if (num >= 10 && num <= 26)dp[i] += dp[i - 2];}return dp[n - 1];}
};

处理边界问题及初始化问题的的技巧:

 我们可以给dp数组多开一个位置,也就是开n+1个空间,使整个数组向右移动一位

这样我们原本的dp【1】也可以移到循环中进行计算了!!!

这里的0,1,2等都是下标

 因此我们多出来一个位置0号下标的值是多少呢?

因为我们后面要计算dp【2】也就是原本的dp【1】的时候会运用到dp【i-2】和dp【i-1】

因为dp【i-1】不会出错,所以我们只需要注意dp【i-2】的正确性

当dp【2】时,也就是两位数字的解码方案数,当我们运用到dp【i-2】的时候,这个是两位数字一起解码,因此dp【i】+=dp【i-2】如果dp【0】为0,即使解码成功也等于没有解码成功,因此这里dp【0】要为1

优化后的代码:

class Solution {
public:int numDecodings(string s) {int n=s.size();vector<int>dp(n+1);dp[0]=1;//初始化if(s[0]>='1'&&s[0]<='9')dp[1]=1;else dp[1]=0;if(n==1)return dp[1];/*if(dp[0]&&s[1]-'0')dp[1]++;int num=(s[0]-'0')*10+(s[1]-'0');if(num>=10&&num<=26)dp[1]++;*/for(int i=2;i<=n;i++){if(s[i-1]>='1'&&s[i-1]<='9')dp[i]+=dp[i-1];int num=(s[i-2]-'0')*10+(s[i-1]-'0');if(num>=10&&num<=26)dp[i]+=dp[i-2];}return dp[n];}
};

这篇关于【算法挨揍日记】day18——746. 使用最小花费爬楼梯、91. 解码方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333763

相关文章

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

mybatis中resultMap的association及collectio的使用详解

《mybatis中resultMap的association及collectio的使用详解》MyBatis的resultMap定义数据库结果到Java对象的映射规则,包含id、type等属性,子元素需... 目录1.reusltmap的说明2.association的使用3.collection的使用4.总

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder