题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路
如果序列是偶数个数,中位数就是中间两个数的,奇数个数就是中间的那一个。
可以把序列排序来找,但是每次插入都排序,效率太低。因为我们只需要知道中间的两个或者一个元素就可以了,所以可以把序列分成两个部分, 左面的部分我们知道最大值,右面的部分我们知道最小值,就可以求出中位数。
这个序列的最大值和最小值可以用两个堆(一个最大堆,一个最小堆)来实现,c++里面用优先队列,
入队的时候,先入队列1,在入队列2,注意入队的时候,如果当前元素要入队列2,但它小于队列1最大值,要把队列1最大值入到队列2,队列1最大值出队,当前元素入队列1。 另一种情况类似
code
class Solution {
public:
priority_queue<int,vector<int>,less<int> >left;//less找最大
priority_queue<int,vector<int>,greater<int> >right;//greater找最小
void Insert(int num)
{
if(left.size()==0){
left.push(num);
return;
}
if(left.size()==right.size()+1){
if(left.top()<=num){
right.push(num);
}else{
right.push(left.top());
left.pop();
left.push(num);
}
}else{
if(right.top()>=num){
left.push(num);
}else{
left.push(right.top());
right.pop();
right.push(num);
}
}
}
double GetMedian()
{
if(left.size()==right.size()){
return (left.top()+right.top())/2.0;
}else{
return left.top();
}
}
};