摩尔投票是什么?
摩尔投票用于寻找集合中出现多数的元素,并且出现多数可以定义为大于n//2或者n//3或者是其他自定义的频次(实际上,如果希望求出超过n//3频次的元素,那么是三个元素相互抵消)。摩尔投票的基本流程为:
- 投票阶段:投票人之间进行抵消。
- 技术阶段:计算对抗结果中最后剩下的候选人票数是否有效。
投票环节
设置候选人candidate以及候选人的票数统计count的两个变量,每次遍历到一个元素的时候对当前候选人的票数进行抵消操作,当票数抵消到0时,选取新的候选人。伪代码如下:
candidate,count=nums[0],1 # 初始候选人为第一个元素,同时票数为1
for i in range(1, len(nums)):
if nums[i]==candidate:
count+=1 # 如果此时和候选人的值是一样的,那么直接对票数进行加一
else: # 如果有新的候选人出现,那么对之前的候选人的票数进行减一操作
if count==0: # 候选人的票被抵消,那么选取新的候选人
candidate=nums[i]
count=1
else: # 继续抵消候选人的票数
count-=1
统计环节
进行投票环节之后并不能保证目前的candidate就是最后想要的,例如有nums为[1,1,2,3,1,4,5,6,8,7]
最后的candidate是8,并不是最后想要的结果,实际上这一组数字也没有频次超过1/2的数字。为了避免这种情况的发生,最后还需要进行统计环节。伪代码如下:
ans=0
for n in nums:
if n==candidate:
ans+=1
if ans>=len(nums)//2:
return candidate
else:
return -1