41 数据流中的中位数
题目
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
C++ 题解
- 创建一个最大堆和一个最小堆;
- 元素依次添加到堆中:
- 大顶堆中的元素都要比小顶堆中的元素小;
- 如果是偶数个元素则保证两个堆中各存放一半元素;
- 如果是奇数个元素则保证多出一个元素放在大顶堆;
- 如果最小堆中数据容量较大,则直接返回最小堆的堆顶元素,否则返回两个堆的堆顶元素和的一半。
class Solution {
priority_queue<int, vector<int>, less<int> > p; //大顶堆
priority_queue<int, vector<int>, greater<int> > q; //小顶堆
public:
void Insert(int num)
{
if(p.empty() || num <= p.top())
p.push(num);
else
q.push(num);
// 大顶堆中元素个数比小顶堆元素个数大2,则恢复一下平衡
if(p.size() == q.size() + 2)
q.push(p.top()), p.pop();
// 大顶堆中的元素个数比小顶堆元素个数少一个,则将多的一个元素放到大顶堆中
if(p.size() + 1 == q.size())
p.push(q.top()), q.pop();
}
double GetMedian(){
// 如果是偶数个元素,则返回大顶堆和小顶堆的堆顶元素和之一半
// 如果是奇数个元素,则因为大顶堆中元素个数比小顶堆中的元素多一个,所以返回大顶堆的堆顶元素
// 这里应该除以2.0,返回浮点类型
return p.size() == q.size() ? (p.top() + q.top()) / 2.0 : p.top();
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.array=[]
def Insert(self, num):
# write code here
self.array.append(num)
self.array.sort()
def GetMedian(self,M):
# write code here
length=len(self.array)
if len(self.array)%2==1:
return self.array[length//2]
else:
return (self.array[length//2-1]+self.array[length//2])/2.0

浙公网安备 33010602011771号