leetcode 第 390 场算法比赛

作者: | 更新日期:

第一题浪费不少时间。

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

零、背景

今天比赛四道题都比较简单。
第一题浪费不少时间,导致做完四道题排名是 179 名,。

A: 暴力或双指针。
B: 贪心枚举。
C: 有序平衡树数据结构题。
D: 字典树模板题。

比赛排名:179。
比赛代码:https://github.com/tiankonguse/leetcode-solutions/tree/master/contest

一、每个字符最多出现两次的最长子字符串

题意:给一个字符串,问子串里相同字符个数不超过2个的最长子串。

方案1:枚举所有子串,统计判断是否符合要求。
复杂度:O(n^2)

方法2:枚举所有起始位置,找到第一个不满足要求的子串。
最坏情况,每个字符恰好出现两次。
复杂度:O(52 n)

方法3:双指针。
复杂度:O(n)

比赛的时候我敲的双指针,浪费不少时间,直接使用方法1,敲代码的效率是最高的。

二、执行操作使数据元素之和大于等于 K

题意:原先数组只有一个值为 1 的元素,有两个操作,求最少操作使得数组和不小于 K。

操作1:数组中选择一个元素,值加1。
操作2:数组中选择一个元素,追增到数组尾部。

思路:可以证明,如果一个答案有操作1和操作2,优先全部进行操作1是最优的。

至于进行多少个操作1再进行操作2,尝试推动计算公式找规律时,发现存在反例。

故只能枚举操作1的次数,计算出操作2,保留最优答案即可。

假设操作1 进行 a 次,则数组中只有1个元素,值为 a+1
操作 2 至少需要进行 k/(a+1)次,数组和才会不小于 k。
答案为 a + k/(a+1)

复杂度:O(n)

三、最高频率的 ID

题意:构造一个数据结构后,动态增加 k 个相同元素或者减去 k 个相同元素,问数据结构中元素的最高频率是多少。

思路:使用一个 hash 统计元素的频率,使用有序平衡树统计频率的次数(频率的频率)即可。

增加:得到元素旧的频率,从有序平衡树和hash中删除,新的频率再分别插入进去。
减少:与增加等价,删除旧的频率,添加新的频率。

复杂度:O(n log(m))

四、最长公共后缀查询

题意:给一个输入字符串数组和询问字符串,求最长公共后缀的字符串,如果有多少,输出长度最短的,依旧多个,输出下标最小的。

思路:字符串反转,则是求最长公共前缀,典型的字典树。

插入:字典树种储存下字符串的长度和下标,路径上保存题意的最优值。
查询:找到公共前缀,返回路径的最优值。

复杂度:O(sum(array))

五、最后

这次比赛比较简单,需要拼手速了,所以排名比较靠后了。

后面做比赛,还是要先评估复杂度,选择可以通过的代码最简单的算法才是最优解。

《完》

-EOF-

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

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

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

tiankonguse +
穿越