数据流中的中位数
构造两个堆,左大顶堆,右小顶堆。
如果奇数,中位数就是做大顶堆的root;如果是偶数,中位数就是两个顶堆root的平均值
class Solution { private: vector<int> min; vector<int> max; public: void Insert(int num) { if(((min.size()+max.size())&1)==0){ //偶数 //一般先都考虑左大顶堆,再考虑右小顶堆 //若num大于右小顶堆root,那就直接放入右小顶堆,不用再考虑左大顶堆了 if(min.size()>0 && num>min[0]){ //如果大于左小顶堆root,就放入左小顶堆中 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(); } //num小于右小顶堆,所以放入左大顶堆 max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); } else{ //奇数 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>()); } } double GetMedian() { int len=min.size()+max.size(); if(len<=0) return NULL; double middle=0; if((len&1)==0) middle=(double)(min[0]+max[0])/2; else middle=(double)max[0]; return middle; } };