题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
算法思想:建一个最大堆和一个最小堆,当插入一个数据时,若小于最大堆的堆顶元素,则插入最大堆。若大于则插入最小堆。每插入一个数据后都要保证max_heap.size() ==min_heap.size()或者max_heap.size() == min_heap.size()+1。
最后若两个size()相等,则取两个堆顶的平均值,否则取最大堆堆顶元素
class Solution { priority_queue<int, vector<int>, less<int>> pLess; //max_heap priority_queue<int, vector<int>, greater<int>> pGreater; //min_heap public: void Insert(int num) { if (pLess.empty() || num <= pLess.top()) pLess.push(num); else pGreater.push(num); if (pLess.size() == pGreater.size() + 2) { pGreater.push(pLess.top()); pLess.pop(); } if (pLess.size() + 1 == pGreater.size()) { pLess.push(pGreater.top()); pGreater.pop(); } } double GetMedian() { return pLess.size() == pGreater.size() ? (pLess.top() + pGreater.top()) / 2.0 : pLess.top(); } };