【算法】寻找数组主元素

该博客讨论了如何在整型数组中寻找主元素,即出现次数超过数组元素个数一半的元素。通过一种优化的查找策略,避免了遍历数组的复杂操作,提高了效率。在查找过程中,利用计数变量记录当前元素出现次数,当计数器变为负数时更新主元素。如果在查找过程中发现计数器超过数组大小的一半,则直接返回当前主元素。这种方法在数据分布均匀时也能确保找到正确的主元素。
摘要由CSDN通过智能技术生成

问题描述:
给定一个整型数组,找出主元素,它在数组中的出现次数大于数组元素个数的二分之一。
思路:
最简单粗暴的方法是对每一个元素查找出现次数,但这样时间复杂度太高。
更好的方法是,从第一个元素nums[0]开始,令变量res=nums[0], 记其出现次数为cnt=1;
此后若出现相同元素则cnt+1,否则cnt-1。
若查找到第i个元素时cnt<0则令res=nums[i],cnt=1。
在查找过程中若cnt>(size/2)则返回res。
若数据分布较为均匀,即查找过程中cnt总小于(size/2),由于主元素数量超过其他元素数量之和,最后剩下的res也一定是主元素,最后返回res。
代码实现:

int majorityNumber(vector<int> &nums) {
        int size = nums.size();
        int cnt = 0;
        int res = 0;
        for(int i=0; i<size; i++){
            if(nums[i] == res){
                cnt++;
            }
            else{
                cnt--;
            }
            if(cnt<0){
                res = nums[i];
                cnt = 1;
            }
            else if(cnt>(size/2)){
                return res;
            }
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值