题目:
思路:
相信看到这道题大家第一个想到的应该都是暴力求解的方法,去套两层循环求解。这样的方法是不靠谱的,时间复杂度达到了O(N),效率非常低。那么我们这里采用一种用空间换取时间复杂度的思路。
这里要利用一下计数排序的思想:
代码:
#include<iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int arr[10001] = { 0 };//题目中有说明数的范围在0到10000
int x = 0;//输入值
int max = 0;//记录最大数的值为多少
for (int i = 0; i < n; i++)
{
cin >> x;
arr[x]++;
if (x > max)
max = x;
}
int count = 0;//用来记录出现的次数
int data = 0;//用来记录出现次数最多的这个数并且在个数相同的情况下值最小
for (int i = 0; i < max; i++)//这个for循环只需要循环到最大值的下标就可以结束,因为后面所有的数都为0个
{
if (arr[i] > count)//如果循环到比count更大的数进if语句
{
count = arr[i];//每次改变一下count的值
data = i;//把i给data
}
else if (arr[i] == count)//如果出现次数相同的数时,找出小的那一个
{
if (i < data)//如果这个数的值比data还小,则交换一下data
{
data = i;
}
}
}
cout << data;
return 0;
}