算法之絕對衆數
定義:絕對衆數就是一個數在一組數中個數超過1/2的數,假設一組數中絕對衆數只有一個,比如
int a[]={8,8,1,1,1,8,1,1,6,1,8};
在這個數組中,1 爲絕對衆數。
那麼我們開始分析:
刪除數組中2個不同的數,絕對衆數是不變的。我們來思考一下原因:
- 如果刪除的兩個數中有一個是衆數,顯然剩餘的衆數個數還是大於(N-2)/2的。
- 如果刪除的兩個數沒有一個是衆數,不變。
記m爲候選衆數,出現次數爲c,初始化爲0。
遍歷數組
- 如果c = 0,則m = a[i]
- 如果c !=0,且m != a[i],則刪除 m和 a[i]
- 如果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;
}