leetcode 第 382 场算法比赛

作者: | 更新日期:

失误了。

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

零、背景

这次比赛最后一题其实不难,但很有迷惑性。

A: 循环判断相邻字母变化次数。
B: 枚举最大值,判断最大答案。
C: 奇偶数个数。
D: 从高位到低位贪心。

一、按键变更的次数

题意:给一个字符串,问相邻字母值变化的次数。

思路:按题意循环判断即可。

二、子集中元素的最大数量

题意:给一个数组,求构造一个最长的数组,前一半相邻是平方关系,后一半是开方的关系。

思路:枚举起始位置或者中间位置即可。

枚举起始位置时,可能不存在答案,需要分情况判断。

枚举中间位置,由于对称性,只需要不断向两边扩展即可。

注意事项:1 比较有特殊,单独判断。

三、Alice 和 Bob 玩鲜花游戏

题意:两个数字,两个人轮流挑一个数字减一,减一后两个数字都是 0 时胜利。
告诉你两个数组的最大值,问第一个人胜利的数字对个数。

思路:数字和为奇数时胜利,枚举一个数字,统计另一个数字和的个数。

优化:矩阵和的奇偶性是对称的,所以每行奇数和偶数的个数确定的,可以直接分奇偶性找规律推导出公式直接计算答案。

四、给定操作次数内使剩余元素的或值最小

题意:给一个数组,每次操作可以选择相邻数字进行与运算,合并为一个数字,求 k 次操作后,剩余数字的或运算的最小值。

思路:贪心。

答案是剩余数字的或运算,显然优先处理高位,最后处理低位。

假设一个高位出现 x 个数字,则最少需要操作 x-1 次才能消除这一位,最多需要 x 次才能消除这一位。

问题:对于连续若干个数字高位都是 1,直接对连续区间合并,是否是最优的。

证明如下:
连续区间先进行合并,如果没有剩余,答案为x-1
还有剩余,之后两边随便选择一个数字进行合并,答案为 x

如果不对连续区间合并,则是区间一分为两半,左边的区间与左边的边界数字合并,右边的区间与右边的边界数字合并,答案为 x

由此可以证明,连续区间合并,答案是最优的。

PS:比赛的时候我证明错了,证明的是贪心有反例,就放弃这道题了。

根据上面的贪心策略,从最高位开始,依次枚举,尝试消除这一位,看 k 次操作是否可行。

五、最后

这次比赛最后一题其实不难,只要想到连续区间可以直接合并,从高位枚举即可。

《完》

-EOF-

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

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

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

tiankonguse +
穿越