思路:要保证数据容器左边的数据都小于右边的数据,用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。
首先要保证数据平均分配到两个堆中,因此两个堆中数据的数目之差不能超过1,为了实现平均分配,可以在数据的总数目是偶数时把新数据插入最小堆,否则插入最大堆,还要保证最大堆中的所有数据都要小于最小堆中的数据。
class Solution {
public:
void Insert(int num)
{
//数据的总数目是偶数时,把数据插入小顶堆
if(((min.size()+max.size()) & 1 )==0)
{
//若插入的数据比大顶堆堆顶小,则应先插入大顶堆,取出大顶堆的堆顶插入小顶堆
//因为必须保证大顶堆的数都小于小顶堆的数
if(max.size()>0 && num<max[0])
{
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());
num=max[0];
pop_heap(max.begin(),max.end(),less<int>());
max.pop_back();
}
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
}
//数据的总数目是奇数时,把数据插入大顶堆
else
{
//若插入的数据比小顶堆堆顶大,则应先插入小顶堆,取出小顶堆的堆顶插入大顶堆
//因为必须保证大顶堆的数都小于小顶堆的数
if(min.size() && num>min[0])
{
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
num=min[0];
pop_heap(min.begin(),min.end(),greater<int>());
min.pop_back();
}
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());
}
}
double GetMedian()
{
double mid=0;
if(((min.size()+max.size()) & 1)==1)
mid=min[0];
else
mid=(min[0]+max[0])/2.;
return mid;
}
private:
vector<int> min;//小顶堆
vector<int> max;//大顶堆
};