leetcode 周赛 493,排名96

作者: | 更新日期:

枚举、并查集

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

零、背景

这次比赛最后一题是并查集,不难,第三题是枚举倒是稍微复杂一些,花费了至少半个小时去调试。

本场题型概览如下。
A 题:贪心。
B 题:分段统计。
C 题:前缀和+枚举。
D 题:并查集。

最终排名:96。
代码仓库:详见 https://github.com/tiankonguse/leetcode-solutions

一、统计范围内的逗号

题意:给一个整数 n,问 [1,n] 内的数字都进行标准化,需要多少个逗号。
标准化定义:每三位数字加一个逗号。
数据范围:10^5

思路:贪心
由于是每三位数字加一个逗号,最大值是五位数,所以每个数字最多需要一个逗号。
具体来说,小于 1000 的数字不需要逗号,大于等于 1000 的数字需要一个逗号。
所以,只需要统计大于等于 1000 的数字数量即可。

二、统计范围内的逗号 II

题意:与第一道题类似,数据范围增大到 10^15

思路:分段统计。
根据第一题找到的规律,可以扩展到所有数据范围:

0 个逗号:[0,10^3)
1 个逗号:[10^3,10^6)
2 个逗号:[10^6,10^9)
3 个逗号:[10^9,10^12)
4 个逗号:[10^12,10^15)
5 个逗号:[10^15,10^18)

故可以分段统计每个区间内的数字数量,然后计算出需要的逗号数量。

三、替换最多一个元素后的最长等差子数组

题意:给一个数组,问至多替换一个元素后,最长等差子数组的长度。

思路:分类讨论+前缀和+枚举

情况一,不修改。
整个数组都是等差数列,直接返回数组长度。

情况二,修改端点。
对于最长的等差数列,随便选择一端,肯定可以替换使得等差数列的长度加一。

情况三,修改中间。
修改中间时,会影响两个差值,只有两个差值相等时才可能得到更长的等差数列。
故,修改元素旁边的两个元素的差值需要是偶数,中间这个值修改为平均数。

修改的值确定了,需要判断修改后的差值与前缀和后缀等差数列是否相等,分三种情况。

情况一,与前缀的等差数列相等,长度加2。
情况二,与后缀的等差数列相等,长度加2。
情况三,与前缀和后缀的等差数列都相等,长度加1。

对于每个点前缀与后缀的等差数列长度,可以预处理得到。
复杂度:O(n)

四、添加一个点后可激活的最大点数

题意:给n个互不相同的二维坐标。
如果两个坐标的 x 坐标或 y 坐标相等,则这两个坐标可以连接。
现在可以任意的添加一个点,问添加这个点后,可以连接的最大的坐标的个数。

思路:并查集

显然,这个是一个图论问题,求最大连通子图大小与次大连通子图大小。

先预处理。每个 x 坐标和 y 坐标,随便记录一个点,当做基准点。
然后对于每个点,与 x 坐标的基准点连接,与 y 坐标的基准点连接。
这样,并查集里就得到了一个图。

然后遍历并查集,统计每个连通子图的大小,存起来。
最后排序,得到最大连通子图的大小和次大连通子图的大小。

特殊情况:如果所有点都连接了,那么最大连通子图的大小就是 n。

五、最后

这次比赛其实不难,但是第三题需要分情况讨论,在加一减一上,容易出错。

《完》。

-EOF-

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

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

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

tiankonguse +
穿越