leetcode 第 268 场算法比赛

作者: | 更新日期:

最后一题打表题,犹豫了一会,排名就到一百名之后了。

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

零、背景

这次比赛最后一题有点意思,我代码敲完了,怕超时,又改成打表了,结果排名就在一百名之后了。

一、两栋颜色不同且距离最远的房子

题意:给一排 n 个房子,每个房子有一个颜色,问不同颜色房子最远相差多少。

思路:由于是求最远,答案有两种可能。
一种是与第一个房子不同颜色的最远距离。
另一种是与最后一个房子不同颜色的最远距离。
分别计算求最大值即可。

二、给植物浇水

题意:给一排植物与需要的水分。
现在我们拿着一个水壶顺序给植物浇水。
水龙头在第一个之前前面。

浇水规则如下:

-)必须按顺序给植物浇水。
-)给当前植物浇水之后,没有足够的水满足下个植物时,需要回到水龙头灌满水。
-)如果可以满足下个植物时,不能提前返回水龙头。

问给所有植物都浇水后,移动距离是多少?

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

如果可以给下个植物浇水,移动距离加一。
如果不能给下个植物浇水,则上个植物位置先回到水龙头,然后再移动到下个植物。

PS:做这道题的时候看错题了,看成如果下个植物不满足时,有多少水就必须先用多少水。

三、区间内查询数字的频率

题意:给一个固定数组,不断的询问指定子数组中某个元素出现的频率。

思路:由于没有修改值,预先预处理数组,统计每个元素都在哪些位置出现过。
询问的时候,使用二分查找即可。

提示:区间询问,等价与前缀询问,求差值即可。

四、k 镜像数字的和

题意:k 镜像数字指的是 10 进制的数字自身是对称的,且转化为 k 进制后依旧是对称的。
求最小的 n 个 k 镜像数字之和。

思路:k 只有 [2, 9], n 最大 30, 如果可以本地预处理跑出来,就可以打表了。

我最开始使用暴力循环做,第一组 k 为 2 就跑不出答案来。

于是我想了想,大部分循环是无效的,因为大部分数字不是 10 进制对称的。
所以我优化了算法,不再是枚举所有自然数,而是从小到大枚举所有对称的10进制数字,结果所有答案瞬间就跑出来了。

之后我就犹豫了:既然这么快,是直接提交代码实时计算呢,还是把答案放在数组里,直接求答案呢。
犹豫了一会,我怕代码实时计算超时,就选择打表了。

打表需要整理所有情况的答案,浪费了不少时间。
当通过这道题时,一看排名,一百名多一点,又没进前百名。

话说回来,如何从小到大枚举对称十进制呢?

这就需要遵循数字的两个性质即可。

性质1:长度小的数字值肯定也小于长度大的数字(废话,但是很重要)。
所以,使用数字的长度依次枚举即可。

性质2:相同长度的数字,由于对称性,只需要看前一半的数字。
此时,可以发现,前一半的数字是连续递增的数字。

例如长度为 5 的数字,前一半就是三位。
连续递增的数字就是 100 ~ 999
所以长度为 5 的对称数字有 999 - 100 + 1 个。

利用这两个性质,这道题就可以瞬间求出答案了。

五、最后

这次比赛难度不大,只要想到直接构造枚举对称数字,就可以做出最后一题吧。

《完》

-EOF-

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

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

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

tiankonguse +
穿越