Boyer-Moore 投票算法
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
分析
投票算法,顾名思义就是按投票的规则,或得票数大于n/2则获选,否则落选。
假设多数元素为condidate,支持condidate则选票+1,否则选票-1,那么所有元素抽象为1和-1的组合,由于condidate元素大于n/2,所以所有元素和一定大于1。
运用这个原理。可以得到Boyer-Moore 投票算法。
算法步骤
- 1.确定初始状态:condidate可以任意选取,condidate的选票count=0;
- 2.遍历数组元素更新状态:
①如果当前元素和condidate相等则选票count+1;
②如果选票不相等则选票count-1;
当选票count小于0时说明当前condidate失去民心需要更新,则将condidate更新为当前元素的值
算法举例
以nums[7] = [2,2,1,1,1,2,2]为例
初始状态
这里nums[0]== 2 != -1;
选票count-1;得到-1;更新condidate的值;且count更新为1
nums[1]==condidate;选票+1
nums[2]!=condidate;选票-1
nums[2]!=condidate;选票-1
nums[3] != condidate;选票-1,count<0;更新condidate;且count更新为1
nums[5] != condidate ;选票-1
nums[6] != condidate;选票-1;选票小于0;更新condidate,选票count=1;
得到最终的多数元素为condidate=2;
代码
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (int num : nums) {
if (num == candidate)
++count;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}
算法分析
时间复杂度:遍历了一遍数组,O(n)
空间复杂度:condidate和count变量,所以是O(1)
算法的局限性
用法比较局限,多数元素个数必须大于n/2.