leetcode 第 277 场算法比赛

作者: | 更新日期:

这次比赛很简单,听说第一名5分钟就AK了。

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

零、背景

今天由于国家的春节假期调休要上班,我没有参加比赛。

晚上做了四道题,发现挺简单的。

一、元素计数

题意:返回不是最大值也不是最小值的元素个数。

思路1:map 统计,减去最大值和最小值的个数即可。
注意实现:所有值都相等时,需要特殊判断。

思路2:排序求出两个最值,然后循环判断不等于最值的个数。
当然,也可以循环查找最值,或者使用STL库查找最值。

PS:两个思路的代码已经上传到 github 了。

二、按符号重排数组

题意:给一个长度为偶数的数组,元素一半为正一半为负。
要求重新排列元素,使得正负数交叉出现,但是正数之间的相对顺序不变,负数之间的相对顺序也不变。

思路:预先申请内存,正数与负数分别使用一个下标标记位置,每遇到一个,偏移量加二即可。

三、找出数组中的所有孤独数字

题意:给一个数组,如果一个数字只出现一次,且相邻的数字不存在,则算孤独的数字。
求孤独数字的个数。

思路1:map 统计,然后遍历数据一次判断即可。

思路2:数组排序,然后判断左右判断即可。
小技巧:可以插入一个无穷小和无穷大的元素,则不需要考虑边界。

PS:两个思路的代码已经上传到 github 了。

四、基于陈述统计最多好人数

题意:有 n 个人,某些人是好人,某些人是坏人。
好人永远说真话,坏人可能说真话。
现在给你一个矩阵,代表每个人对其他人的评价:好人、坏人、不确定。
问好人最多可能为多少个,使得矩阵中的评价不冲突。

思路:看数据范围,只有 15,显然是 Bit 位压缩了。

枚举 Bit ,然后判断枚举的好人说的话是否冲突即可。

判断方法也很简单,如果一个人是好人,则他的话都是真话。
判断他的话(不确定的忽略)是否和枚举值冲突即可。

复杂度:2^15 * n^2

对于一个枚举值,判断是否冲突,通过预处理可以优化到 O(n)的复杂度。

具体是假设一个人是好人,然后计算出这个人对其他人好人与坏人评价的 bit 位,以及不确认的 Bit 位。
这样就可以通过一个位运算快速判断一个好人的话是否冲突。

综合复杂度2^15 * n

PS:优化前与优化后的代码已经上传到 github 了。

五、最后

这次比赛题目很简单,不过最后一题还蛮有意思的。

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

github: https://github.com/tiankonguse/leetcode-solutions.git

《完》

-EOF-

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

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

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

tiankonguse +
穿越