leetcode 第 344 场算法比赛

作者: | 更新日期:

题目比较简单,手速慢了点,没进前百名。

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

零、背景

这次比赛题目比较简单,拼手速的时候到了,我 29 分钟全部 1AC 做完,没进前百名。

一、找出不同元素数目差数组

题意:给一个数组,问每个位置前缀和后缀集合大小的差值。

思路:按照题意预处理出每个位置前缀和后缀的集合大小,之后求差值即可。

二、频率跟踪器

题意:交互式题,有三个操作。
1)添加一个元素
2)删除一个元素
3)问是否存在某个元素的出现次数为 freq

思路:维护元素的个数,以及各频率的个数即可。

元素个数:map<v, num>
频率个数: map<num, count>

增加一个元素,旧的频率个数减一,新的频率个数加1,元素个数加一。
删除一个元素,与增加一个元素相反。
询问:直接看频率个数是否大于零。

注意事项:删除元素时,元素不存在需特殊处理。

三、有相同颜色的相邻元素数目

题意:给一个原先没有颜色值的数组,现在不断地对数组进行染色。
问每次染色之后,整个数组中相邻元素颜色相等的数组。

思路:与上一题类似的统计题,统计当前的答案。

每次染色可以转化为取消染色与染色。

取消染色就是相邻元素颜色相同转化为不同,左右最多两个。
染色就是相邻元素颜色不同转化为相同,左右最多两个。

四、使二叉树所有路径值相等的最小代价

题意:给一个完全二叉树,怎么修改才能使得所有根到叶子的路径全部相等,求最小修改代价。
修改代价:一次可以选择一个节点值加一。

思路:可以推断出,答案最优时,根到叶子的路径和也是最小的。

起初我想的是二分路径和,结果发现可以直接计算出路径和。
即原始二叉树中的最大路径。

对于其他路径,把差值都加到叶子上,即可构造出一个答案,但是不是最优值。
分析不是最优值的原因,是因为有些相邻父节点的叶子都进行了修改。
如果把修改上移到父节点,则可以降低修改的次数。

所以可以从叶子节点向上倒推,合并两个儿子的公共修改次数。
这样就可以计算出最优答案了。

五、最后

这次比赛虽然简单,但是最后一题有点贪心的味道,想到就很简单,想不到就难了吧。

最后一题你是怎么做的呢?

《完》

-EOF-

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

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

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

tiankonguse +
穿越