leetcode 第 289 场算法比赛

作者: | 更新日期:

粗心大意了,不然有可能进去前百名。

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

零、背景

这次比赛题目不难,第三题看错题了,浪费不少时间。

最后理解正确题意后,双层循环敲错一个地方,导致错了一次,最终没能进去前百名,遗憾。

下面来看看题解吧。

一、计算字符串的数字和

题意:给一个数字字符串。
从前到后 k 个一组,每组内的数字字符相加得到新的数字,最后所有数字组成新的字符串。
如果新的字符串长度大于 K,继续进行上面的操作,直到不大于 K。
求最终的字符串。

思路:按照题意模拟即可。

通过时间:0:05:13

二、完成所有任务需要的最少轮数

题意:给一个数组,每轮可以消除两个或三个相同的数字,问最少需要多少轮可以消除所有数字。
如果存在数字无法消除,返回 -1。

思路:先使用 map 统计数字,每个数字单独判断需要多少轮。

每个数字单独处理逻辑如下:

1)如果数字出现一次,无法消除,没有答案。

2)如果数字大于一次,优先使用三个数字一轮来消除,根据剩余的数字来分情况判断。

-)剩余 0 个数字,则所有数字都使用 三个数字消除。
-)剩余 1 个数字,需要取消一轮三个数字,组成两轮 2 个数字。
-)剩余 2 个数字,则增加一轮 2 个数字即可。

通过时间: 0:10:06

三、转角路径的乘积中最多能有几个尾随零

题意:给一个矩阵,求一个不重叠的路径,这个路径最多只能有一个拐角。
问路径上数字乘积最多有多少个后缀 0。

思路:

看错题了,以为可以有无数个拐角,发现搜索爆炸,状态无法保存,先做第四题。

第四题过之后,看榜单第三题过的人很多,于是怀疑看错题了。
再阅读题,发现只能有一个拐角,那就是大水题,枚举所有拐角即可。

由于求的是乘积后缀 0 最多,所以对于一个拐角路径,两头无限扩充到边缘,答案只会更优。
同样道理,对于一个没有拐角的直线路径,加一个拐角,答案也只会更优。

所以最优答案肯定是一个拐角,两头是与边缘接触。
注:1*n 的矩阵,可以理解为拐角一头长度为 0 即可。

算法:

首先预处理所有点在四个方向到达边缘时,乘积上 2 的个数与 5 的个数。
然后枚举每个顶点为拐角,再枚四个方向两两组合为拐角时,能够得到的最优答案。

注:统计完 2 和 5 后,答案为最少的那个。

通过时间;0:43:13
罚时:错误一题,罚时 5 分钟。

四、相邻字符不同的最长路径

题意:给一个树,每个节点有一个字母。
求一个最长路径,路径上的相邻两个节点字母不同。

思路:简单题,一个递归解决。

递归的时候,求出子树上的最长路径,更新答案。
递归的返回值为以子树为端点的最长路径。

子树最长路径:子树根自身长度为1,再找到 节点值与自己不同的路径最长的儿子。

子树答案:自己长度为 1, 再加上 节点值与自己不同的路径最长的两个儿子。

通过时间:0:24:15

五、最后

这次比赛看错题了,不然有可能进入前百名。

另外,这次比赛笔误错误一次,不然也可以进去前百名。

但是再一想,也许快进去前百名的这些人都是我这样想的。

从这个角度看,还是自己的问题。

以后还是要认真读题,并加强阅读速度、理解速度、思考速度,敲代码速度的能力。

加油,算法人。

《完》

-EOF-

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

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

点击查看评论

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

tiankonguse +
穿越