众数问题

众数问题

       给定含有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);
		
	}
}
 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值