题目
思路
使用两个优先队列min和max分别存储较小的和较大的两组数据,如果总个数是奇数就优先存到min。min以less为优先级,越大的数优先级越高。max以greater为优先级,越小的数优先级越高。这样的话,如果两个优先队列长度不同,中位数就是min的队头,如果两个优先队列的长度相同,中位数就是min和max的队头的平均。addNum函数用来添加数据进优先队列。如果这个数小于min的队头或者min中没有数据,那就把数据添加进min中。添加之后,再判断min和max的长度,如果长度有差距,就把一个队列的队头push进另一个队列。
代码
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int,vector<int>,less<int>> min;
priority_queue<int,vector<int>,greater<int>> max;
MedianFinder() {}
void addNum(int num) {
if(min.size()==0||num<min.top()){
min.push(num);
if(min.size()>max.size()+1){
max.push(min.top());
min.pop();
}
}else{
max.push(num);
if(max.size()>min.size()){
min.push(max.top());
max.pop();
}
}
}
double findMedian() {
if(min.size()>max.size())
return min.top();
else
return (min.top()+max.top())/2.0;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/