刚开始,自己想的办法,但是TLE了,以下是代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct node{
int num;
int counts;
};
void quickSort(node nums[],int left,int right){
int i = left;
int j = right;
node temp = nums[left];
if(left>=right){
return;
}
while(i!=j){
while(i<j && nums[j].counts>=temp.counts)
j--;
if(j>i)
nums[i] = nums[j];
while(i<j && nums[i].counts<=temp.counts)
i++;
if(i<j)
nums[j] = nums[i];
}
nums[i] =temp;
quickSort(nums,left,i-1);
quickSort(nums,i+1,right);
}
int main()
{
int n,num;
int k = 0;
int zhong=0,chong=0;
cin>>n;
node nums[n];
memset(nums,-1,sizeof(nums));
for(int i=0;i<n;i++){
int flag = 0;
cin>>num;
for(int j=0;j<k;j++){
if(nums[j].num == num){
nums[j].counts++;
flag = 1;
break;
}
}
if(flag == 0){
nums[k].num = num;
nums[k].counts = 1;
k++;
}
}
quickSort(nums,0,k-1);
chong = nums[k-1].counts;
zhong = nums[k-1].num;
for(int j =k-1;j>=0;j--){
if(nums[j].counts>=chong && nums[j].num<=zhong)
{
chong = nums[j].counts;
zhong = nums[j].num;
}
if(nums[j].counts<chong)
break;
}
cout << zhong <<endl<<chong<<endl;
return 0;
}
在网上找到了一个膜拜大佬的,AC了:
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int main()
{
multiset<int>ms; //定义一个插入的值可以重复的集合
int n,m,value;
scanf("%d",&m); //输入该样例的元素个数
for(int i=0;i<m;i++)
{
scanf("%d",&value);
ms.insert(value); //将数据元素插入到multiset中
}
multiset<int>::iterator it; //定义迭代器
int max =0,num; //max 为重数 num为个数
for(it=ms.begin();it!=ms.end();it++)//遍历集合
{
if(max<ms.count(*it)) //如果重数小于该元素出现个数
{
max=ms.count(*it); //令 ms.count(*it) 为重数
num=*it; //当前数据为众数
}
}
cout<<num<<endl<<max<<endl; //输出 众数 和 重数
ms.clear();
}
自己试着改善一下,依旧TLE:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 50001
struct node{
int num;
int counts;
};
int main()
{
int n,num;
int k = 0;
int zhong=N,chong=0;
cin>>n;
node nums[n];
for(int i=0;i<n;i++){
cin>>num;
int flag = 0;
for(int j=0;j<k;j++){
if(nums[j].num == num){
nums[j].counts++;
if(nums[j].counts>chong){
chong = nums[j].counts;
zhong = nums[j].num;
flag = 1;
break;
}
if(nums[j].counts>=chong){
if(zhong>nums[j].num)
zhong = nums[j].num;
}
}
}
if(flag == 0){
nums[k].num = num;
nums[k].counts = 1;
if(nums[k].counts>chong){
chong = nums[k].counts;
zhong = nums[k].num;
}
if(nums[k].counts>chong){
if(zhong>nums[k].num)
zhong = nums[k].num;
}
k++;
}
}
cout << zhong <<endl<<chong<<endl;
return 0;
}
通过高人指点,发现桶排竟然可以通过
#include <bits/stdc++.h>
using namespace std;
int a[100000];
int main()
{
memset(a,0,sizeof(a));
int n;
int num;
int z,c=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>num;
a[num]++;
}
for(int i=0;i<100000;i++ ){
if(a[i]!=0&&c<a[i])
{
c = a[i];
z = i;
}
}
cout<<z<<endl<<c<<endl;
return 0;
}