169. 求众数 && 229. 求众数 II

本文介绍了一种解决主元素问题的高效算法——摩尔投票算法。该算法可以在O(n)的时间复杂度和O(1)的空间复杂度下找出数组中出现次数超过n/2的元素。同时,还讨论了如何将此算法扩展到找出出现次数超过n/3的多个元素,并给出了详细的实现代码。

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

不限定时间复杂度的话,很多人会先排序,再遍历的方法来做。不限定空间复杂度的话,很多人会用hash表来做。那么,有了这两个限定,就只能用摩尔投票算法了。

主元素问题典型解法。摩尔投票算法:时间复杂度O(n),空间复杂度O(1)

169

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int ans=nums[0],cnt=1;
        for(int i=1;i<nums.size();i++){
            if(cnt==0){ans=nums[i];cnt++;}
            else if(nums[i]==ans)cnt++;
            else cnt--;     
        }
        return ans;
    }
};

229

问题升级为选取大于等于n/3的数,简单分析可知,大于n/3的数最多有两个。(反证法轻轻松松即可证明),采取和169一样的摩尔投票算法,只不过,这次保留两个元素出现的次数。另外一个区别是这个题目没有保证此众数一定存在,所以,在得到两个候选众数之后,需要再次遍历一遍验证。

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> res;
        int m = 0, n = 0, cm = 0, cn = 0;
        for (auto &a : nums) {
            if (a == m) ++cm;
            else if (a ==n) ++cn;
            else if (cm == 0) m = a, cm = 1;
            else if (cn == 0) n = a, cn = 1;
            else --cm, --cn;
        }
        cm = cn = 0;
        for (auto &a : nums) {
            if (a == m) ++cm;
            else if (a == n) ++cn;
        }
        if (cm > nums.size() / 3) res.push_back(m);
        if (cn > nums.size() / 3) res.push_back(n);
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值