? 温故而知新
? 今日挑战
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]输出: 2
先思考一下,后面我会给出一个解题思路~?
图来自网络
Way 1
第一种方法最直接,直接使用Python的库collections里的方法Counter,直接统计所有元素出现的次数,返回最大次数的元素即可。
Python实现:
def majorityElement(nums):
counts = collections.Counter(nums)
print(counts)
return max(counts.keys(), key=counts.get)
Way 2
第二种方法这里介绍一下Boyer-Moore 投票算法。
1 )因为题目中对于众数的定义为出现次数大于 ⌊ n/2 ⌋ 的元素
,因此我们把众数记为 +1,把其他数记为 -1,将它们全部加起来,显然和大于 0 。
2 )这里,我们把第一次出现的数字,当做为当前的候选者,循环迭代,如果出现不一样的数字,投票器减1,出现相同的数字,投票器加1,如果投票器为0,重新挑选当前位置的数字作为新的候选者,从当前的位置开始,继续迭代。
可以看下面的例子:
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
首先,下标为 0 的 7 被当做众数的第一个候选。在下标为 5 处,计数器会变回0 。所以下标为 6 的 5 是下一个众数的候选者。由于这个例子中 7 是真正的众数,所以通过忽略掉前面的数字,我们忽略掉了同样多数目的众数和非众数。因此, 7 仍然是剩下数字中的众数。
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]
现在,众数是 5 (在计数器归零的时候我们把候选从 7 变成了 5)。此时,我们的候选者并不是真正的众数,但是我们在 遗忘 前面的数字的时候,要去掉相同数目的众数和非众数(如果遗忘更多的非众数,会导致计数器变成负数)。
因此,上面的过程说明了我们可以放心地遗忘前面的数字,并继续求解剩下数字中的众数。最后,总有一个后缀满足计数器是大于 0 的,此时这个后缀的众数就是整个数组的众数。
Python实现:
def Moore(nums):
count=0
target=None
for i in range(len(nums)):
print(i)
print(target)
if target==None or count==0:
target=nums[i]
count+=1
else:
if target == nums[i]: count+=1
else: count-=1
return target
? 配图角色背景介绍
绯红女巫(Scarlet Witch)是美国漫威漫画旗下超级英雄,初次登场于《X战警》(The X-Men)第4期(1964年3月),由编剧斯坦·李和画家杰克·科比联合创造。本名旺达·姜戈·马克西莫夫(Wanda Django Maximoff),她的起源故事版本众多,漫画中最新剧情是由吉普赛人姜戈和玛丽所生,小时候和双胞胎弟弟快银(比绯红女巫晚出生30秒)一起被高进化者(High Evolutionary)绑架当做实验对象,从而获得了混沌魔法(创造和湮灭物质)和修改概率的能力,后来二人被骗,听信了自己是万磁王的孩子,母亲抛弃了他们,接生的牛头女士把他们交给了吉普赛人夫妇的这个说法。还和弟弟共同加入万磁王领导的变种人兄弟会。后得知真相改邪归正,加入复仇者联盟。并且遇到了同为复仇者成员的幻视,于是两人坠入爱河结为夫妻。
原著中的绯红女巫跟快银一样也是十分强大的存在,但是由于她是变种人超能力不受控,曾经由于超能力时空使得复仇者联盟分崩离析,更是差点将变种人灭绝。不过复仇者系列电影中的绯红女巫还未成长到那种地步,仅仅是初出茅庐的小姑凉,但是具导演坦然如果在电影中把绯红女巫的实力展现出来,那么《美国队长3:内战》就可以不用拍了,全场被女巫一个秒杀。而且在电影中虽然绯红女巫的力量来源于心灵宝石,但是就连幻视都是被她完虐的份,虽然这存在着部分感情因素。