【算法挨揍日记】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

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2