给定一个未排序的整数数组,找到其中位数。
中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第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; } } } }