LeetCode 53.最大子数组和17.电话号码的字母组合

在这里插入图片描述

最大子数组

难度 简单 OJ链接
在这里插入图片描述
解题思路:
假设,有这样的一个数组:
在这里插入图片描述
我们先设置第一个数为最大值max,然后设一个dp变量,来记录当前以下标i结尾的最大子数组的和
结合上图来看,第一个数字它的最大的子数组的和就是它自己。那么我们一开始就可以把dp设为第一个数。然后从下标1开始。
在这里插入图片描述
当i为1时,指向的数是2,是正数。现在我们就要判断dp此时是正数还是负数。因为此时dp是下标为0结尾的最大子数组和,dp是1正数,那么我们就需要加上,因为正数+正数会更大。加上之后dp是3,dp比max大,就把dp赋值给max。

然后i来到2,指向的数是-5。此时dp是下标为1结尾的最大子数组和,dp是3,是正数。加上dp是-2,-2小于max,所以max不变。

然后i来到3,指向的数是4。此时dp是下标为2结尾的最大子数组和,dp是-2,是负数。负数我们不加,那么下标以3结尾的最大子数组和就为4。4赋值给dp,然后dp大于max,把dp赋值给max。

然后i来到4,指向的数是1。此时dp是下标为3结尾的最大子数组和,dp是4,是正数。正数加上之后为5。5给dp,dp大于max,把dp赋值给max。

然后i来到5,指向的数是-2。此时dp是下标为4结尾的最大子数组和,dp是5,是正数。加上是dp是-3,-3小于max,所以max不变。

此时max是5,也就是下标为4的子数组和最大。

代码实现如下:
在这里插入图片描述

电话号码的字母组合

难度 中等 OJ链接
在这里插入图片描述
解题思路:
首先,它输入的是数字字符串"23",而23对应的字符字符串是abc和def。而这两个字符字符串组成的组合一共有3*3=9种。而每种组合是从每个字符字符串各选一个来组合,每一个组合它的字符个数等于数字字符的个数。
在这里插入图片描述
这里,我们可以采取递归的方式来做。
第一步:我们可以定义一个字符串数组来做我们的成员变量,里面存的是数字对应的字符串。
在这里插入图片描述
第二步:我们有四个参数,第一个参数就是输入的数字字符串。第二个参数是为了取数字字符串下标对应的数字。第三个参数是组合的字符串。第四个参数是返回结果的数组。
在这里插入图片描述
第三步:我们取数字字符串对应的数字,然后去取数字对应的字符串。
在这里插入图片描述
第四步:像上面的例子,我们首先取得的是数字2。数字2对应的字符字符串是abc。然后我们需要在abc中取一个字符,来组合到combineStr。然后再从下一个字符字符串中取一个字符来组合。
在这里插入图片描述
那么什么时候递归结束呢?当di等于数字字符串的个数时,就没有数字可取了,就递归结束。
在这里插入图片描述
代码如下
在这里插入图片描述
但此时代码是有问题的。我们用vs2019调试看一下:
在这里插入图片描述
此时,我们完成了第一组组合,返回会返回到递归函数那里。然后在def里面取第二个字符组合。
在这里插入图片描述
但此时di为3,combineStr为adc。那么就会出现错误,递归回来di应该还是1,combineStr为a才对。所以我们需要这样写:
在这里插入图片描述
这样我们既可以往下递归di和combineStr,又不会改变此时函数里的di和combineStr。

最后一步:如果是空字符串,直接返回空vector。
在这里插入图片描述

好了,这篇文章就到这里。如果大家觉得有帮助,可以点赞收藏。谢谢大家!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是电话号码字母组合问题的 C++ 代码实现: ``` class Solution { public: vector<string> letterCombinations(string digits) { unordered_map<char, string> mapping = { {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"} }; vector<string> res; if (digits.empty()) { return res; } string combination; backtrack(res, combination, digits, 0, mapping); return res; } void backtrack(vector<string>& res, string& combination, string& digits, int index, unordered_map<char, string>& mapping) { if (index == digits.size()) { res.push_back(combination); return; } for (char c : mapping[digits[index]]) { combination.push_back(c); backtrack(res, combination, digits, index + 1, mapping); combination.pop_back(); } } }; ``` 其中 `letterCombinations` 函数用来生成所有的字母组合,`backtrack` 函数用来进行回溯操作。在 `letterCombinations` 函数中,首先根据数字字符和字母的映射关系创建了一个 `unordered_map` 对象 `mapping`。然后定义了一个空字符串 `combination` 和一个空 vector `res` 来保存最终结果。最后调用了 `backtrack` 函数来生成所有的字母组合。在 `backtrack` 函数中,首先判断是否达到了数字字符串的末尾,如果是,则将当前的 `combination` 字符串保存到 `res` 中。否则,遍历当前数字字符所能表示的所有字母,依次加入到 `combination` 字符串中,然后递归调用 `backtrack` 函数,添加下一个数字字符所能表示的字母。递归完成后,需要将 `combination` 字符串还原到上一个状态,以便进行下一次回溯。最终返回 `res` 数组即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值