我们先写个暴力直接双层循环,暴力枚举
但是会发现要超时,所以要有所优化。
优化思路:
首先先排个序这样咸通的数,就在一起,所以就可以枚举一下重复次数最多的数,到底重复了多少遍:
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
mx = max(mx,cnt);
}else cnt=1;
}
题目要求输出有多少个众数:
int num = 0 ;
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
if (cnt == mx) num++;
}else cnt=1;
}
最后在同一输出,因为之前已经排序了,所以直接输出就是从小到大:
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
if (cnt == mx) cout<<a[i]<<' ';
}else cnt=1;
}
于是整个优化代码便是:
#include<bits/stdc++.h>
using namespace std;
//众数:出现次数最多的数
const int maxn = 1e6 + 10;
int n;
int a[maxn];
int main() {
cin>>n;
for (int i = 1; i <= n ; i ++ ) {
cin>>a[i];
}
sort(a+1,a+n+1);
//
int cnt = 1, mx = 1 ;
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
mx = max(mx,cnt);
}else cnt=1;
}
int num = 0 ;
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
if (cnt == mx) num++;
}else cnt=1;
}
cout<<num<<endl;
for (int i = 2; i <= n + 1; i ++ ) {
if (a[i]==a[i-1]) {
cnt++;//多了一个相等的数
if (cnt == mx) cout<<a[i]<<' ';
}else cnt=1;
}
return 0;
}