LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
解题的关键在于维护两个队列,即最小堆和最大堆,最小堆保存大于中位数的数列,最大堆保存小于中位数的队列,保证最小堆和最大堆的长度差不超过2,谁超谁第一个元素就要移到对方,找中位数的时候,如果长度为偶数,那么返回两个堆头的平均值,如果长度为奇数,返回最小堆的头(最小堆允许比最大堆大1),代码如下:
class MedianFinder {
public:
// 小于中位数的数列(从大往小)
priority_queue<int, vector<int>, less<int>> queMin;
// 大于中位数的数列(从小往大)
priority_queue<int, vector<int>, greater<int>> queMax;
MedianFinder() {}
void addNum(int num) {
// 小于中位数或者为初始值
if (queMin.empty() || num <= queMin.top()) {
queMin.push(num);
// 长度差为2
if (queMax.size() + 1 < queMin.size()) {
queMax.push(queMin.top());
queMin.pop();
}
} else {// 大于中位数
queMax.push(num);
// 大于中位数的序列长了
if (queMax.size() > queMin.size()) {
queMin.push(queMax.top());
queMax.pop();
}
}
}
double findMedian() {
// 序列长度为奇数
if (queMin.size() > queMax.size()) {
return queMin.top();
}
// 序列长度为偶数
return (queMin.top() + queMax.top()) / 2.0;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
以上是关于LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章