最大子数组
难度 简单 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。
好了,这篇文章就到这里。如果大家觉得有帮助,可以点赞收藏。谢谢大家!