数据流中的中位数.
解题步骤:
/*
解题思路:
得出一个数据流的中位数的问题我们可以之间建立两个堆,一个是大根堆,而另一个就是小根堆,通过建立两个
堆的关系从而来达到我们的目的(找出中位数)
*/
class MedianFinder {
public:
/** initialize your data structure here. */
MedianFinder() {
/* 此处可以省略... */
}
void addNum(int num) {
max_heap.push(num); //默认进入大根堆
/*
这里为了维护这两个堆的关联关系,我们需要需要考虑两种情况
*/
//情况一:需要交换,而交换的条件是如果大根堆的堆顶元素大于小根堆的堆顶元素,那么就交换他们的值
//加min_heap.size()判断目的是防止小根堆已经为空了不再pop
if(min_heap.size() && max_heap.top() > min_heap.top())
{
//交叉交换
int mint = min_heap.top();
int maxt = max_heap.top();
//出堆
min_heap.pop();
max_heap.pop();
//交换插入
min_heap.push(maxt);
max_heap.push(mint);
}
//情况二 :需要转移 ,如果大根堆的元素个数已经超过了小根堆的元素个数的两个那么就需要将大根堆的
//元素push进小根堆,再弹出大根堆的元素
if(max_heap.size() > min_heap.size() + 1)
{
int tmp = max_heap.top();
max_heap.pop();
min_heap.push(tmp); //取出大根堆的堆顶元素,push进小根堆里面
}
}
double findMedian() {
//如果两个堆里面的数据个数是奇数个那么直接返回大堆的堆顶元素
if((min_heap.size() + max_heap.size()) & 1 == 1) return max_heap.top();
//如果堆里面的数据个数是偶数个就将大根堆和小根堆的堆顶元素相加再返回他们的平均值
else return (max_heap.top() + min_heap.top()) / 2.0;
}
priority_queue<int> max_heap; //大堆
priority_queue<int, vector<int>, greater<int>> min_heap; //小堆
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
总结:这道题对代码控制上要求并没有多高,但是难在维护两个堆的结构以及整个思考的过程