维护一个最小堆和一个最大堆,平衡两个堆的个数,两种情况:
- 最大堆比最小堆个数多 1
- 最大堆和最小堆个数相同
如果个数相等,返回两个数的平均值。如果最大堆比最小堆个数多1,那么返回最大堆的堆顶元素即为中位数。
通过下面代码就可以实现:
//寻找中位数
double findMedian(vector<int>& data)
{
if (data.size() == 0)
{
return -1;
}
priority_queue<int, vector<int>, less<int>> lessHeap;
priority_queue<int, vector<int>, greater<int>> greaterHeap;
for (int i = 0; i < data.size(); i++)
{
if (lessHeap.size() < 1 || data[i] <= lessHeap.top())
{
lessHeap.push(data[i]);
}
else {
greaterHeap.push(data[i]);
}
if (lessHeap.size() == greaterHeap.size() + 2)
{
greaterHeap.push(lessHeap.top());
lessHeap.pop();
}
if (lessHeap.size()+1 == greaterHeap.size())
{
lessHeap.push(greaterHeap.top());
greaterHeap.pop();
}
}
return lessHeap.size() == greaterHeap.size() ? (lessHeap.top() + greaterHeap.top()) / 2.0 : lessHeap.top();
}