题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
数字的模式是指在一堆给定数字中出现次数最多的数值,如5,5,5,3,3,2,6,4,它的模式就是5。现在你的任务,就是从数字中找到它的模式.
输入输出格式
输入描述:
第一行为整数N.从第二行开始为N个整数。对于输入的每个数,有( |input_number| <= 2000000 ).
输出描述:
输出这些数字的模式,如果模式个数不为1,选择它们之中较小的。
输入输出样例
输入样例#:
10 1 2 3 4 5 6 7 8 9 9
输出样例#:
9
题意分析:
看到这题,首先想到的是,利用数组存所有可能的数字,数组下标对应数字,元素值对应其出现的次数。但题目中|input_number| <= 2000000,所以这样做带来的空间开销太大了。
于是,换了一种思路,用数组存下所有的数,然后进行升序排列,记录下每个元素出现的次数,并不断更新模式最大的数字,这样求出来的便是数值最小、模式最多的数字,而且空间开销为logn,时间开销为nlogn,比较合理。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main()
{
int N;
cin >> N;
int* num = new int[N];
for (int i = 0; i < N; i++) {
cin >> num[i];
}
qsort(num, N, sizeof(num[0]), cmp);
int ans = num[0], maxc = 1;//记录次数最多的数字和模式
int tmp = num[0], count = 1;//记录当前数字及其模式
for (int i = 1; i < N; i++) {
if (num[i] == tmp) {
count++;
}
else {
if (count > maxc) {//更新最多的数字及其模式
ans = tmp;
maxc = count;
}
tmp = num[i];
count = 1;
}
}
cout << ans << endl;
return 0;
}