leetcode 第 343 场算法比赛

作者: | 更新日期:

五一在旅游度假,没参加比赛。

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

零、背景

五一假期去成都旅游了,,所以就没参加周赛。

找时间做了一下题,分享下题解。

一、保龄球游戏的获胜者

题意:告诉你保龄球的计分规则,问两个选手谁赢。
计分规则:如果强两个球至少有一个满分,则当前得分翻倍。

思路:按照题意判断计算即可。

小技巧:记录最近一次的满分为止,可以更方便判断。

二、找出叠涂元素

题意:矩阵的每个方格中有不同的数字灯,现在给一个序列,代表打开数字灯的顺序。
问第几个灯亮时,第一次出现某行或者某列灯全亮。

思路:

1)预处理出每个数组对应的矩阵坐标。
2)维护两个数组,代表各行和各列亮灯的个数。
3)以此打开灯,更新行数组和列数组,并判断是否都亮了。

三、前往目标的最小代价

题意:现在有一个坐标,坐标之间移动时间等于曼哈顿距离。
现在给你虫洞,从一个坐标传送到另外一个坐标有一定的时间成本,问从起点到达终点的最短时间是多少。

思路:单源最短路。

每个虫洞坐标、起点、终点的坐标离散化为图中的顶点,构造出一个有向完全图,边都等于曼哈顿距离。
对于虫洞,如果距离更短,则更新对应的有向边。

然后跑最短路即可。

四、字典序最小的美丽字符串

题意:给一个美丽字符串 S,求一个字典序大于S的美丽字符串,如果存在多个,输出字典序最小的那个。
美丽字符串:字母由前 k 个字母组成,子串不能存在长度大于 1 的回文串。

思路:枚举+贪心。

1)由于是求字典序最小,所以需要让前缀尽量的不变。
枚举前缀的长度,有大到小,判断是否存在答案,存在即找到最优答案。

2)前缀固定后,由于需要满足字典序大于 S,所以前缀之后的第一位的字符需要大于 S。
可以从小到大枚举所有字符,且需要满足不存在回文串。

3)前缀+第一个字符确定后,,贪心构造之后的字符即可。

贪心依据:由于前缀不存在回文子串,所以接下来的字符只需要判断是否与前两个字符相等即可。

如下图,假设前缀的最后三个字符是 abc,则接下来的字符不能是 c,也不能是 b,可以是其他任意字符。

abc
abcc
abcb
cbca

所以我们通过前两个字符,就可以确定接下里最小字符是什么。
上面的贪心过程也可以证明,字符个数大于 3 个时,贪心肯定存在答案。

复杂度分析:虽然是枚举,但一旦存在答案,就可以马上计算出答案,如果不存在答案,也可以马上确定不存在答案。
复杂度:O(n)

五、最后

这次比赛题目比较简单。

明天又是周日了,我可以正常参加比赛了。
明天下午还是春季团队赛,我也可以参加比赛。
之前春季个人赛,我一直没时间写解题报告,下周看有没有时间写吧。

《完》

-EOF-

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

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

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

tiankonguse +
穿越