剑指Offer(Python多种思路实现):数据流中的中位数
面试41题:
题目:数据流中的中位数
题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
解题思路一:直接法,排序后求中位数
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
解题思路二:
import heapq as hq
class MedianFinder:
def __init__(self):
self.lo, self.hi = [], [] # lo is max_heap, hi is min_heap
def addNum(self, num):
hq.heappush(self.lo, -num)
hq.heappush(self.hi, -hq.heappop(self.lo))
if len(self.lo) < len(self.hi):
hq.heappush(self.lo, -hq.heappop(self.hi))
def findMedian(self):
if len(self.lo) == len(self.hi):
return (-self.lo[0]+self.hi[0]) / 2.0
else:
return float(-self.lo[0])