描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
思路:建立一个 大根堆 A 和 小根堆 B ,各保存列表的一半元素。
当两堆的数据个数相等时候,左边堆添加元素。
采用的方法不是直接将数据插入左边堆,而是将数据先插入右边堆,算法调整后,将堆顶的数据插入到左边堆,这样保证左边堆插入的元素始终是右边堆的最小值。
同理左边数据多,往右边堆添加数据的时候,先将数据放入左边堆,选出最大值放到右边堆中。
#include<queue>
#include<vector>
#include<functional>
using namespace std;
class Solution {
priority_queue<int,vector<int>,less<int> > maxHeap;//大根堆,堆顶为最大值
priority_queue<int, vector<int>, greater<int> > minHeap;//小根堆,堆顶为最小值
public:
void Insert(int num) {
if (maxHeap.size() == minHeap.size())
{
minHeap.push(num);
maxHeap.push(minHeap.top());
minHeap.pop();
}
else
{
maxHeap.push(num);
minHeap.push(maxHeap.top());
maxHeap.pop();
}
}
double GetMedian() {
if (maxHeap.size() == minHeap.size())
return (maxHeap.top() + minHeap.top()) / 2.0;
else
return maxHeap.top()*1.0;
}
};