问题描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 样例
输入:1, 2, 3, 4输出:1,1.5,2,2.5 解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。使用大根堆维护序列的前半部分,使用小根堆维护序列的后半部分。序列是指的从小到大排列。首先向大根堆里面加入元素,如果加入元素不满足条件,那么再进行下一步操作,其中条件是:1)大根堆里面的元素最多只能比小根堆的元素多1个,如果多两个的话,就需要将大根堆的元素弹出来放到小根堆里面去,2)如果大根堆里面的堆顶元素大于小根堆里面的堆顶元素,那么这样的序列不是有序的,则需要交换这两个元素使得大的部分在小根堆里,小的部分在大根堆里。
class Solution { public: priority_queue<int> max_heap; priority_queue<int,vector<int>,greater<int>> min_heap; void insert(int num){ max_heap.push(num); if(min_heap.size()&&max_heap.top()>min_heap.top()) { auto maxv=max_heap.top(),minv=min_heap.top(); max_heap.pop(),min_heap.pop(); max_heap.push(minv),min_heap.push(maxv); } if(max_heap.size()>min_heap.size()+1) { min_heap.push(max_heap.top()); max_heap.pop(); } } double getMedian(){ if(max_heap.size() + min_heap.size() & 1) return max_heap.top(); return (max_heap.top()+min_heap.top())/2.0; } };