80. 中位数

给定一个未排序的整数数组,找到其中位数。

中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

样例

给出数组[4, 5, 1, 2, 3], 返回 3

给出数组[7, 9, 4, 5],返回 5

挑战 

时间复杂度为O(n)

这道题难易度定为简单是建立在“直接排序然后取中位数”的基础上的,这个解法很无脑,确实没什么好说的

你甚至不用自己实现快排,绝大多数语言都有自己的排序方法

所以问题就在于怎样在O(n)内解出来

首先就应该想到用空间换时间,这已经不算是思路而是套路了

用什么数据结构?hash_map

key就是数,value就是这个数出现的次数

这个可以通过一次遍历来构建这个map。同时在遍历的时候我们可以得到数组中的最大最小值

现在我们有所有数出现的次数,有最大最小值,那么就可以在最大最小值的范围内遍历map,获得中位数

int median(vector<int> &nums) {
        // write your code here
        map<int, int> record;
        int num_max=nums[0], num_min=nums[0];
        for(int num:nums){
            record[num]++;
            num_max=max(num_max, num);
            num_min=min(num_min, num);
        }
        int mid=(nums.size()%2)?nums.size()/2+1:nums.size()/2;
        for(int i=num_min;i<=num_max;i++){
            while(record[i]>0){
                record[i]--;
                mid--;
                if(mid==0){
                    return i;
                }
            }
        }
    }
原文地址:https://www.cnblogs.com/TheLaughingMan/p/8313564.html