题意:设计一个数据结构,支持两个操作:插入数和找出该序列的中位数。也就是在一个不断增加的序列中找出中位数。
思路:用两个堆,一个大顶堆,一个小顶堆。每当来一个数时,如果这个数小于大顶堆的最大值,则插入大顶堆,否则插入小顶堆。如果这两个堆的大小不一样,则调配一下(偶数个数时两个堆的大小相等,奇数个数时大顶堆的大小-1=小顶堆)。中位数操作,对于奇数时,则是大顶堆的最大值,否则则是大顶堆的最大值加上小顶堆的最小值除以2。
代码:
class MedianFinder {
public:
int size=0;
priority_queue<int> big;
priority_queue<int, vector<int>, greater<int> > small;
// Adds a number into the data structure.
void addNum(int num) {
int t,b,s;
size++;
if(size==1) big.push(num);
else if(num>big.top()) small.push(num);
else big.push(num);
if(size%2==0&&big.size()!=small.size() || size%2==1&&big.size()-1!=small.size())
{
if(big.size()>small.size())
{
t=big.top();
big.pop();
small.push(t);
}
else
{
t=small.top();
small.pop();
big.push(t);
}
}
}
// Returns the median of current data stream
double findMedian() {
if(size%2==0) return (big.top()+small.top())/2.0;
return big.top();
}
};