LeetCode #229 - Majority Element II

本文介绍了一种线性时间和常数空间复杂度的算法,用于找出数组中出现次数超过n/3的所有元素。通过投票算法的概念,该算法假设最多有两个这样的元素,并通过遍历数组来更新计数,最后验证这些元素是否确实满足条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.

Note: The algorithm should run in linear time and in O(1) space.

Example 1:

Input: [3,2,3]
Output: [3]

Example 2:

Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        # 数组中次数大于n/3的元素最多为两个,假设为m和n,那么每次遍历到其中一个数,都让相应的计数加一
        # 每次遍历到其他数,让两个计数都减一,假如确实存在两个数符合要求,那么其他数的次数小于n/3,最终两个计数都大于0
        # 如果只存在一个数m符合要求,那么为了让它的计数减少到k,最少需要2k个数,因为必须先让一个数的计数增加到k
        # 然后再用k个其他的数,让这两个数的计数减少k,因此最终m的计数大于0,所以这种投票的方法保证符合要求的数最终的计数一定大于0
        # 但是由于数组中不一定存在两个符合要求的数,所以我们还需要验证得到的m和n是不是符合要求
        int m=0, n=0, cm=0, cn=0;
        for(auto num:nums) 
        {
            if(num==m) cm++;
            else if(num==n) cn++;
            else if(cm==0) m=num, cm=1;
            else if (cn==0) n=num, cn=1;
            else cm--, cn--;
        }
        vector<int> result;
        cm=cn=0;
        for (auto num:nums) {
            if(num==m) cm++;
            else if(num==n) cn++;
        }
        if (cm>nums.size()/3) result.push_back(m);
        if (cn>nums.size()/3) result.push_back(n);
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值