一本通1186 出现次数超过一半的数(类似桶排序)

Posted 57xmz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通1186 出现次数超过一半的数(类似桶排序)相关的知识,希望对你有一定的参考价值。

【题目描述】

给出一个含有n(0 < n ≤ 1000)个整数的数组,请找出其中出现次数超过一半的数。数组中的数大于-50且小于50。

【输入】

第一行包含一个整数n,表示数组大小;

第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。

【输出】

如果存在这样的数,输出这个数;否则输出no。

【输入样例】

3
1 2 2

【输出样例】

2



代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],f[101]={};//根据取值范围定义101数组
for(int i=0;i<n;i++)
{
cin>>a[i];//输入数值
f[a[i]+50]++;//桶排序的精髓,对应数的桶里个数加1。这里有一个细节,就是我加了50,因为每个数的数据范围在-50到50之间,但是整型数组是没有负数号的,所以我加50存下来
}
for(int i=0;i<n;i++)
{
if(f[a[i]+50]>n/2)//如果这个数超过一半,则输出,并结束
{
cout<<a[i];
return 0;
}
}
cout<<"no";//如果没有结束,就输出“no”
return 0;
}

以上是关于一本通1186 出现次数超过一半的数(类似桶排序)的主要内容,如果未能解决你的问题,请参考以下文章

数组中出现次数超过一半的数

数组中出现次数超过一半的数字

数组中有一个数字出现次数超过数组长度一半,找出这个数字(用C语言解决)。要求时间复杂度尽量小。

如何找出数组中出现次数超过长度一半的元素

数组中出现次数超过一半的数字

28数组中出现次数超过一半的数字