题目十:
给定一个未排序的整数数组,找到其中位数。
中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。
样例
给出数组[4, 5, 1, 2, 3], 返回 3
给出数组[7, 9, 4, 5],返回 5
挑战
时间复杂度为O(n)
代码:
class Solution {
public:
/*
* @param : A list of integers
* @return: An integer denotes the middle number of the array
*/
int median(vector<int> &nums) {
// write your code here
return Get(nums,0,nums.size()-1);
}
int Get(vector<int> &nums,int start,int end)
{
int low = start;
int high = end;
while(start<end)
{
while(start<end)
{
if(nums[end]<nums[start])
{
swap(nums[end],nums[start]);
start++;
break;
}
end--;
}
while(start<end)
{
if(nums[start]>nums[end])
{
swap(nums[start],nums[end]);
end--;
break;
}
start++;
}
}
if(nums.size()-1-start>nums.size()/2)
{
Get(nums,start+1,high);
}
else if(nums.size()-1-start<nums.size()/2)
{
Get(nums,low,start-1);
}
else
{
return nums[start];
}
}
};
算法就是快速排序。因为说要求中位数,比该数据大的数有N/2个,那这个数据就是中位数,用快速排序是我首先想到的方法,一趟快速排序以后判断比轴值大的数据的个数,大于N/2个说明中位数在轴值右侧,小于N/2个中位数在轴值左侧,等于N/2直接返回轴值。按题目要求,不管N是偶数还是奇数,比中位数大的元素个数都是N/2个,自己找数据试一下就知道了。
思路有点类似第K大元素(传送门:第K大元素)