多数投票算法——Boyer–Moore majority vote algorithm

Boyer-Moore 多数投票算法用于在给定元素中找到超过 N/2 次出现的多数元素(O(N) 时间复杂度和 O(1) 空间复杂度)。

思想很简单,某个元素出现了,如果其等于候选元素,则候选元素票数增加 1 次;如果不等于候选元素,则候选元素票数减少 1 次。当候选元素票数减为零,则重新选择当前元素为候选元素,继续往后遍历,重复上述操作。

最后需要注意检查最后候选元素正确性(出现次数是否确实超过 N/2 次)。

算法解析

当然也可以用来在给定元素中找到超过 N/3 次出现的多数元素。

leetcode 229

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;
    }
};
原文地址:https://www.cnblogs.com/lkltcl/p/15378722.html