CCF 中间数(满分代码 + 解题思路 :哈希) 201612-1

解题思路

首先统计数组中每一个数值出现的个数(用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;
}

猜你喜欢

转载自blog.csdn.net/qq_51800570/article/details/129151500