摩尔投票算法(Moore's Voting Algorithm)也称之为投票算法,用于解决绝对众数问题。
绝对众数问题
在一个集合中,如果一个元素的出现次数比其他所有元素的出现次数之和还多,那么就称它为这个集合的绝对众数。等价地说,绝对众数的出现次数大于总元素数的一半。
算法过程
我们可以把查找绝对众数的过程想象成一次选举,我们选定一个候选人,对于每一张新的选票,如果它投给了当前的候选人,票数+1,否则票数-1,当票数为0时,我们可以认为当前候选人不具优势,把下一张选票对象选定为新的候选人。
实例:
集合:[2,2,1,1,3,2,2]
选举过程:
轮数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
投票 | 2 | 2 | 1 | 1 | 3 | 2 | 2 |
候选人 | 2 | 2 | 2 | 2 | 3 | 3 | 2 |
票数 | 1 | 2 | 1 | 0 | 1 | 0 | 1 |
结果:
众数:2
代码实现
int majorityElement(vector<int>& nums) {
int c = 0;
int k = 0;
for(auto it = nums.begin(); it != nums.end(); ++it)
{
if(0 == c) k = *it;
k == *it ? ++c : --c;
}
return k;
}
这个算法的时间复杂度是O(n),空间复杂度是O(1)。