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

//数组中某个元素出现次数超过了数组长度的一半,找出这个元素
思路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
            

上一篇:基础理论~raft协议的个人理解


下一篇:ROUGE: A Package for Automatic Evaluation of Summaries