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;
        }
    };
    
  • 相关阅读:
    写了个批量下载抖音无水印视频的小软件。
    ffmpeg转换参数码
    WPF
    使用EF的Code First模式创建模型
    桌面置顶显示服务器信息
    Assert.assertEquals
    XML报文解析思路
    定时任务,cron七域
    检查网络是否通畅
    Ngnix运行vue项目
  • 原文地址:https://www.cnblogs.com/lkltcl/p/15378722.html
Copyright © 2011-2022 走看看