解题思路
首先统计数组中每一个数值出现的个数(用map)
然后将数组进行排序
从小到大排序,每次遍历到的数都是数组中第一次出现该数值的位置
小于a[i]的数的个数为i - 1
大于a[i]的数的个数可以通过总数 – 小于a[i]的个数 – a[i]的个数来计算
如果<a[i]的个数与>a[i]的个数相等,则a[i]就为中位数
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <set>
using namespace std;
const int N = 1010;
unordered_map <int, int> m;
int a[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++)
{
cin >> a[i];
m[a[i]] ++; //对a数组中出现的数的次数进行统计
}
sort(a + 1, a + 1 + n); //将a数组进行排序
int res = -1;
for (int i = 1; i <= n; i += m[a[i]])
{
int s1 = i - 1; //<a[i]的数的个数
int s2 = n - s1 - m[a[i]]; //>a[i]的数的个数可以通过总数-<a[i]的个数-a[i]的个数来计算
//cout << i << " " << s1 << " " << s2 << endl;
if (s1 == s2) //如果<a[i]的个数与>a[i]的个数相等,则a[i]就为中位数
{
res = a[i];
break;
}
}
cout << res;
return 0;
}