多数投票算法——Boyer–Moore majority vote algorithm
Boyer-Moore 多数投票算法用于在给定元素中找到超过 N/2 次出现的多数元素(O(N) 时间复杂度和 O(1) 空间复杂度)。
思想很简单,某个元素出现了,如果其等于候选元素,则候选元素票数增加 1 次;如果不等于候选元素,则候选元素票数减少 1 次。当候选元素票数减为零,则重新选择当前元素为候选元素,继续往后遍历,重复上述操作。
最后需要注意检查最后候选元素正确性(出现次数是否确实超过 N/2 次)。
当然也可以用来在给定元素中找到超过 N/3 次出现的多数元素。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
// 题目要求**超过** N/3 次,故最多有两个候选者
int candidate1 = INT_MAX, candidate2 = INT_MAX, vote1 = 0, vote2 = 0;
for(auto i : nums) {
if(i == candidate1) {
vote1++;
} else if(i == candidate2) {
vote2++;
} else if(vote1 == 0) {
candidate1 = i;
vote1++;
} else if(vote2 == 0) {
candidate2 = i;
vote2++;
} else {
// 只有当前元素与两个候选元素都不相等时才递减,两个候选元素之间不投反对票
vote1--;
vote2--;
}
}
int check1 = 0, check2 = 0;
for(auto i : nums) {
if(i == candidate1) {
check1++;
} else if(i == candidate2) {
check2++;
}
}
vector<int> ans;
if(check1 > nums.size() / 3) ans.push_back(candidate1);
if(check2 > nums.size() / 3) ans.push_back(candidate2);
return ans;
}
};