zoukankan      html  css  js  c++  java
  • 多数投票算法——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;
        }
    };
    
  • 相关阅读:
    Codeforces Round #384 (Div. 2) 解题报告
    Codeforces Round #383 (Div. 2) 解题报告
    (DFS、bitset)AOJ-0525 Osenbei
    (DFS、全排列)POJ-3187 Backward Digit Sums
    自考新教材-p169
    自考新教材-p167
    自考新教材-p166
    自考新教材-p165
    自考新教材-p161
    自考新教材-p159
  • 原文地址:https://www.cnblogs.com/lkltcl/p/15378722.html
Copyright © 2011-2022 走看看