leetcode 第 292 场算法比赛

作者: | 更新日期:

速度太慢,准备练习打字了。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛题目不难,但是我打字速度太慢,没进前一百名。

我计划再次启动练习打字的计划了,速度提上来后,排名应该可以提升不少。

一、字符串中最大的 3 位相同数字

题意:给一个字符串,求最大的连续三个相同数字子串。

思路:循环一遍找到所有子串答案,求最大值即可。

二、统计值等于子树平均值的节点数

题意:给一个二叉树,问子树的平均值等于子树根的值的个数。
子树的平均值定义:子树所有节点之和除以子树节点个数,向下取整。

思路:递归求出每个子树的节点和与节点个数,就可以判断当前子树是不是答案。
子树的返回值是子树的节点和与节点个数,这样就可以求出父节点作为子树的答案。

三、统计打字方案数

题意:给一个老式按键手机,不同数字映射若干不同的字母。
如果一个数字映射多个字母,按出对应字母需要按键多次,次数就是字母的位置。
例如,数字 2 对应 abc 三个字母,敲出字母 a 需要按一次数字 2,敲出字母 c 需要按 3 次数字 2。
现在给一个数字字符串,代表按键顺序,问可以敲出多少不同的字符串。

思路:典型的动态规划题。

状态定义:f(n) 代表前 n 个数字可以按出的字符串个数。

根据最后一位连续数字的长度,以及这个数字最多可以按多少次,分别枚举按的次数。

状态转移方程:

f(n)=f(n-1) + f(n-2) + ... + f(n-k)

含义:最后一个数字连续的长度至少为 k,且这个数字映射的字母个数至少为 k 个。

四、检查是否有合法括号字符串路径

题意:给一个矩阵,值是左括号或者右括号。
问从左上角到右下角的路径中是否存在一条合法的括号匹配。

思路:典型的动态规划题。

判断一个字符串是否括号匹配时,需要使用栈来判断。
实际上,可以不使用栈,计数左括号的个数即可。
从左到右扫描字符串,遇到左括号加一,遇到右括号减一,中间没有得到负值且最终结果为 0 代表括号匹配。

作为,对于这道题,每个状态就是左括号的个数集合。

状态定义:f(i, j) 到达这个坐标时,不同左括号个数集合,空代表不可到达。

状态转移:左边和上边的状态合并,当前坐标值是左括号,则集合里的值都加1,否则都减一。

答案:判断最后一个状态的集合里是否存在 0。

五、最后

这次比赛题目不难。

加油,算法人。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越