众数 C++

90 阅读2分钟

小明最近在上数学课,老师给小明布置了个作业:在 n个数里找出所有的众数。  众数的定义是这样的:在所有数当中出现次数最多的数被称为众数。并且根据定义,众 数有可能有多个。  你能解决这个问题吗?  输入格式 第一行一个整数n。  第二行有n个整数,ai表示第i个数。  40%的数据,1<=n<=400  100%的数据,1<=n<=1000000,1<=ai<=1000000000 输出格式 输出一行,包括一个整数k,表示众数的个数。  接下来一行包括k 个整数,每个整数都表示一个众数,并且从小到大输出。 输入格式 第一行一个整数n。  第二行有n个整数,ai表示第i个数。  40%的数据,1<=n<=400  100%的数据,1<=n<=1000000,1<=ai<=1000000000 输入: 10  3 3 3 2 3 1 2 2 1 2 输出: 2  2 3 浅说:这道题想了好久,想不出来,最后参考了大佬的题解,写的非常好,膜拜大佬~  大家有没有什么更好的解题方法呢~

using namespace std;
long long arr1[1000005],arr2[100005];
int main()
{
    int n=0,m=0,a=0,b=0,c=0;
    //m:用于记录最终找到的众数的个数,初始化为 0
    //a:用于在遍历数组 arr1时,统计当前数字连续出现的次数,初始化为 0
    //b:用于记录到目前为止出现次数最多的数字的出现次数,初始化为 0
    //c:临时变量 
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>arr1[i];
    }
    sort(arr1,arr1+n);
    for(int i = 0;i < n;i++){
    	if(c != arr1[i]){
    		c = arr1[i];
    		a = 0;
		}else{
			a++;
		}
		if(a > b){
			b = a;
			m = 0;  //重点  
		}
		if(c == arr1[i] && a == b){
			arr2[m++] = arr1[i];
		}
		}	 
    cout<<m<<endl;
    for(int i = 0;i < m;i++){
    	cout<<arr2[i]<<' ';
	}
    
    return 0;
}