算法之绝对众数
定义:绝对众数就是一个数在一组数中个数超过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;
}