229. Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

s思路:
1. 之前遇到是出现次数大于n/2,这次是出现次数n/3,出现次数越少,要找到就越难,相当于信号变弱,噪声不变,那么信噪比变差,仍要想办法译码一样。
2. 找到所有的数,出现频率超过n/3,也就是说最多只有两个数,最少一个都没有。
3. 参考https://leetcode.com/discuss/42806/boyer-moore-majority-vote-algorithm-generalization
4. 肯定是要多设置计数器的,因为信噪比降低,就必须多挖掘信息,用两个计数器分别来做,但为什么这样做可以得到结果,不得究竟啊。
5.尝试去猜想这么想的人的思维:由于最多有两个值满足条件,那么就设两个变量maj1和maj2来记录,主要就是记录出现的次数cnt1和cnt2。如果当前值等于maj1那就cnt1++,表示这个值的可能性增大,如果当前值等于maj2,cnt2++,也表示这个值是maj2的可能性变大,如果发现都不等,那么就看cnt1是否等于0,等于0表示maj1现在还没有可能的candidate,那就让当前值来做这个candidate,并cnt计数为1;如果cnt1大于0,则继续看cnt2是否等于0,如果cnt2==0,说明maj2也没有合适的人选,那就用当前值来试一下;最后如果cnt1,cnt2都大于0,并且当前值和maj1,maj2都不等,只有cnt1–,cnt2–以表示当前值和两个candidate都不一样!

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        //
        int maj1=0,maj2=0,cnt1=0,cnt2=0;
        vector<int> res;
        for(int k:nums){
            if(maj1==k) cnt1++; 
            else if(maj2==k) cnt2++;
            else if(cnt1==0){maj1=k;cnt1=1;}
            else if(cnt2==0){maj2=k;cnt2=1;}
            else {cnt1--;cnt2--;}
        }
        cnt1=0;cnt2=0;
        for(int k:nums){
            if(maj1!=maj2){
                if(maj1==k) cnt1++;
            }
            if(maj2==k) cnt2++;     
        }
        if(cnt1>nums.size()/3) res.push_back(maj1);
        if(cnt2>nums.size()/3) res.push_back(maj2);
        return res;     
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值