众数问题
给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5},其众数为2,其重数为3。
要求:对给定的n 个自然数组成的多重集S,计算S 的众数及其重数。
样例输入:
6
1
2
2
2
3
5
样例输出:
2
3解:
众数问题:
将数组进行排序之后,类似二分查找。
从中间开始向两边查找,当找到与中间的数不相同的数时
rr-ll-1代表当前的数字出现的次数,与记录的sum比较
当未查询左右两个部分,数字数量比sum还多的话,继续查找两部分。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int a[100000];
int num,sum;
void find(int left,int right)
{
int ll,rr;
int mid=a[(left+right)/2];
printf("=========%d\n",mid);
int i,j;
i = j = (left + right) / 2;
while(a[i--] == mid);
ll = i + 1;
while(a[j++] == mid);
rr = j - 1;
printf("%d==========%d\n",ll,rr);
if(sum<rr-ll-1)
{
sum=rr-ll-1;
num=mid;
}
if(ll-left>sum)
find(left,ll-1);
if(right-rr>sum)
find(rr+1,right);
}
int main()
{
int n;
int j=1;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
num=sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
find(0,n-1);
printf("Case#%d:\n",j++);
printf("众数:%d,重数:%d",num,sum);
}
}