关于寻找海王id的算法伪代码分析思路

这篇博客探讨了如何在数组中找出出现次数超过一半的元素,以及出现次数恰好为一半的元素。文章提出了三种不同的算法思路,包括排序、顺序统计主元以及消除法。对于超过一半的元素,可以通过顺序统计主元达到线性时间复杂度;对于恰好一半的情况,通过特定的计数策略来判断和排除。博客还提供了伪代码来详细解释这两种情况的处理过程。

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

//数组中某个元素出现次数超过了数组长度的一半,找出这个元素
思路1,先排序再返回数组N/2的元素,算法复杂度是nlgn
思路2, 顺序统计主元的思想,可以达到o(n)级别的复杂度
思路3,消除法 定一个候选值,和次数变量,如果和候选值一样
就次数加1,如果不一样,新的后选址加1,最后返回次数不为0的那个
searchValue(A):
    int candicate = A[0]//候选值
    int times=1//出现的次数,原始次数为1,不是0
    len = A.length
    for (int i =1;i<len-1; i++)
    {
    if(nTimes ==0)
    {
        candicate = A[i];
                nTimes =1;
                continue;
                        
    }
    if (A[i] == candicate)
    {
        nTimes++;    
         }
         else
            nTimes--;

    }
        print candidate
            
     }
//数组中某个元素出现次数恰好为一半,找出这个元素
思路:排序算法不好用,不知道返回哪个元素。
水王恰好为一半,说明总数为偶数
不失一般性,假设隔一个数就是水王id,两两不同最后一定会消减为0
1,水王可能是最后一个元素 每次扫描多一个动作和最后一个元素比较,单独计数为N/2
2,水王不是最后一个元素,计数不足一半去掉最后一个元素,水王就是那个candidate

伪代码如下:
     search(A):
    int candidate = A[0]
    int ntimes = 1;
    N=A.length
        int countOfLast = 0;//统计最后元素出现的次数
    for (int i=1;i<N;i++)
       //增加和最后一个元素比较的步骤
            if (A[i] == A[N-1])
                countOfLast++;

        if (ntimes == 0)
        candidate = A[i]
        ntimes=1;
                countinue
            if (A[i]==candicate)
        nTimes++;
            else
                nTimes--;
        if countOfLast ==N/2:
        return A[N-1]
        else
        print candidate
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值