Pure Soul

  1. 首页
  2. 算法
  3. 正文

摩尔投票

2021年10月22日 1439点热度 0人点赞 0条评论

摩尔投票是什么?

摩尔投票用于寻找集合中出现多数的元素,并且出现多数可以定义为大于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
标签: leetcode 摩尔投票 算法
最后更新:2021年10月22日

ycq

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2021 oo2ee.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS