美文网首页php
【算法题】6.求主元素

【算法题】6.求主元素

作者: _涼城 | 来源:发表于2020-04-13 11:30 被阅读0次
    题目

    已知⼀个整数序列A = (a0,a1,a2,...an-1),其中(0<= ai <=n),(0<= i<=n). 若存在ap1= ap2 = ...=apm = x,且m>n/2(0<=pk<n,1<=k<=m),则称x 为 A的主元素. 例如,A = (0,5,5,3,5,7,5,5),则5是主元素; 若B = (0,5,5,3,5,1,5,7),则A 中没有主元素,假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出数组元素中的主元素,若存在主元素则输出该元素,否则输出-1.

    题目大意:

    主元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

    输入:

    [1,2,5,9,5,9,5,5,5]

    输出:

    5

    解析:

    摩尔投票算法

    1. 维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count0

    2. 遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:

      如果 x 与 candidate 相等,那么计数器 count 的值增加 1;

      如果 x 与 candidate 不等,那么计数器 count 的值减少 1。

    3. 在遍历完成后,candidate 即为整个数组的众数。

    4. 遍历数组中,candidate出现的次数是否大于n / 2,大于返回candidate ,否则返回-1。

    复杂度分析

    时间复杂度:O(n)

    空间复杂度:O(1)

    代码
    int MainElement(int *A,int n){
     int count = 0;
     int key = A[0];
    
     for (int i = 0; i < n; i++)
     {   
         if (A[i] == key)
         {
             /* code */
         }else{
             if (count > 0)
             {
                 count--;
             }else{
                 key = A[i];
                 count = 1;
             }
         }
     }
     if (count > 0)
     {
         for (int i =count= 0; i < n; i++)
         {
             if (A[i] == key)
             {
                 count++;
             }
         }
     }
     if (count > n / 2)
     {
         return key;
     }
     return -1;
    }
    

    相关文章

      网友评论

        本文标题:【算法题】6.求主元素

        本文链接:https://www.haomeiwen.com/subject/fkkgmhtx.html