1057 数字模式的识别

题目描述

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值