选择绝对众数

绝对众数的概念表示序列中的唯一众数,且出现的次数大于 N2 N 表示序列的长度。
实际上在序列中如果某个数的出现次数超过该序列长度的一半,那么该数一定是唯一的众数。

解决这个问题的办法有多:
1.排序,时间复杂度为O(nlogn),返回nums[N/2]。
2.使用hash,时间复杂度可以降低到 O(n) ,但需要额外的空间复杂度。

有更好的办法, O(n) 的时间复杂度 O(1) 的空间复杂度。

从人的角度来看待这个问题,可以这样来做:从序列中,每次挑选两个不一样的数,从序列中删除,剩下最后的数一定是绝对众数。
比如说序列 [1 2 5 3 3 3 3]
删掉(1,2)
删掉(5,3)
剩下的都是相同的为所求。

根据这个思路,可以这样做。
1、对于计算机来说,它只能从头到尾对数组进行遍历,没有办法去挑两两不同的元素,为了模拟上述过程,我们定义一个count和一个表示当前可能成为“多数派”的元素candidate。
2、.在一次扫描中,如果元素和当前candidate相同则count++,不同则count-–,表示删除一对两两不同元素,当count减为0时,我们就需要更新我们的candidate了。

代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count=0;
        int candidates=nums[0];
        int size=nums.size();
        for(int i=0;i<size;++i)
        {
            if(count==0)
            {
                candidates=nums[i];
                count=1;

            }
            else
            {
                if(candidates==nums[i])
                {
                    ++count;
                }
                else
                {
                    --count;
                }
            }
        }
        return candidates;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值