描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
数据范围:数据流中数个数满足
1≤n≤1000 ,大小满足 1≤val≤1000
进阶: 空间复杂度 O(n) , 时间复杂度 O(nlogn)
示例1
输入:
[5,2,3,4,1,6,7,0,8]
返回值:
"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "
说明:
数据流里面不断吐出的是5,2,3…,则得到的平均数分别为5,(5+2)/2,3…
示例2
输入:
[1,1,1]
返回值:
"1.00 1.00 1.00 "
思路:可以用一个最大值堆和最小值堆可存一半的数据
# -*- coding:utf-8 -*-
import heapq
class Solution:
def __init__(self):
self.minHeap = [] # 最小值堆(堆顶最小, 存放较大的另一半数据)
self.maxHeap = [] # 最大值对(堆顶最大,存放较小的另一半数据), 数乘 -1 用最小堆实现
def Insert(self, num):
# write code here
heapq.heappush(self.maxHeap, -1*num)
#### 保证最小值堆的元素个数和最大值堆相同, 或多一个
if len(self.maxHeap) > len(self.minHeap):
top = heapq.heappop(self.maxHeap)*-1
heapq.heappush(self.minHeap, top)
elif len(self.maxHeap) == len(self.minHeap): #保证最小值堆的最小值>=最大值堆的最大值
if -1*self.maxHeap[0] > self.minHeap[0]:
temp1 = -1*heapq.heappop(self.maxHeap)
temp2 = heapq.heappop(self.minHeap)
heapq.heappush(self.maxHeap, -1*temp2)
heapq.heappush(self.minHeap, temp1)
def GetMedian(self):
# write code here
if len(self.minHeap) == len(self.maxHeap):
return (self.minHeap[0]-self.maxHeap[0])/2
else:
return self.minHeap[0]