演算法之絕對眾數

xuzhenlei1234發表於2016-02-28

演算法之絕對眾數

定義:絕對眾數就是一個數在一組數中個數超過1/2的數,假設一組數中絕對眾數只有一個,比如

int a[]={8,8,1,1,1,8,1,1,6,1,8};

在這個陣列中,1 為絕對眾數。

那麼我們開始分析:

  • 刪除陣列中2個不同的數,絕對眾數是不變的。我們來思考一下原因:

    1. 如果刪除的兩個數中有一個是眾數,顯然剩餘的眾數個數還是大於(N-2)/2的。
    2. 如果刪除的兩個數沒有一個是眾數,不變。
  • 記m為候選眾數,出現次數為c,初始化為0。

  • 遍歷陣列

    1. 如果c = 0,則m = a[i]
    2. 如果c !=0,且m != a[i],則刪除 m和 a[i]
    3. 如果c !=0,且m = a[i],則c++。

程式碼如下:

#include"stdio.h"
int fun(int a[],int size)
{
    int count = 0;
    int m = a[0], i;
    for(i=0;i<size;i++)
    {
        if(count==0)
        {
            m = a[i];
            count = 1;
        }
        else if(m != a[i])
        {
            count --;
        }
        else
        {
            count++;
        }
    }
    return m;
}
int main()
{
    int a[]={8,8,1,1,1,8,1,1,6,1,8};

    printf("%d",fun(a,sizeof(a)/sizeof(a[0])));

    return 0;
}

相關文章