摩尔投票法介绍
摩尔投票法(Boyer–Moore majority vote algorithm),也被称作「多数投票法」,算法解决的问题是:如何在任意多的候选人中(选票无序),选出获得票数最多的那个。
算法可以分为两个阶段:
对抗阶段:分属两个候选人的票数进行两两对抗抵消
计数阶段:计算对抗结果中最后留下的候选人票数是否有效
假设投票是这样的,[A, C, A, A, B],ABC是指三个候选人。
第一张票与第二张票进行对坑,如果票不同则互相抵消掉;
接着第三票与第四票进行对坑,如果票相同,则增加这个候选人的可抵消票数;
这个候选人拿着可抵消票数与第五张票对坑,如果票不同,则互相抵消掉,即候选人的可抵消票数-1。
下面咱们举个例子来帮助我们理解什么是摩尔投票法。
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目链接
示例:
输入: [2,2,1,3,1,2,2]
输出: 2
解题思路
以 [2,2,1,3,1,2,2] 为例进行分析。
先初始化候选人,将第一个元素赋值给candidate,且票数为0
遍历第一个元素时,candidate=2,与初始值相等,所以票数count+1,即count=1
当遍历到第二个元素2时,与candidate相同,所以candidate仍然为2,且票数+1。