摩尔投票法(高阶打擂) leetcode229. 求众数 II

本文介绍了摩尔投票法,这是一种用于查找数组中出现次数超过阈值元素的算法。详细阐述了算法流程,并通过LeetCode 229题《求众数II》为例,解释了如何应用此方法找出数组中出现超过n/3次的元素。解决方案中使用了双指针策略,有效找出众数。
摘要由CSDN通过智能技术生成

1.摩尔投票法简介

(1)用途

用于解决查找大小为 的整数数组,找出其中所有出现严格大于 ⌊ n/k  次的元素。

(2)算法

k-1个仓库,(严格大于 ⌊ n/k  次的元素可能有1~ ⌊ n/k  个)

1.如果新来的数本来仓库中有,则仓库存量+1。

2.如果新来的数仓库中没有并且有空的仓库(数的次数为0),则来的新数加入仓库。

3.如果新来的数仓库中没有并且所有仓库都不为空则所有仓库中库存-1。

(3)算法可行性

即严格大于 ⌊ n/k  次数是否一定会在仓库中,如果想把n/k的数移除仓库至少需要

⌊ n/k ⌋+1) * k

2. leetcode229. 求众数 II

给定一个大小为 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

示例 1:

输入:[3,2,3]
输出:[3]
class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> vc;
        int c1 = 0, c2 = 0, r1 = INT_MIN, r2 = INT_MIN;
        for(auto num : nums){
            if(r1 == num) c1++;
            else if(r2 == num) c2++;
            else if(!c1) r1 = num, c1++;
            else if(!c2) r2 = num, c2++;
            else c1--, c2--;
        }
        c1 = 0, c2 = 0;
        for(auto num : nums){
            if(num == r1) c1++;
            else if(num == r2) c2++;
        }
        int n = nums.size();
        if(c1 > n / 3) vc.push_back(r1);
        if(c2 > n / 3) vc.push_back(r2);
        return vc;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值