思路:
① 需要一个数据容器来保存从流中读出来的数据
②
补充知识:无序数组中位数
解法一:先排序再找中位数
解法二:小根堆(网上代码跑不了,堆排序不熟,不知道是那道题,只知道这样O(n))
思想是:
1 对无序数组的前len(array)//2长度的元素建立最小堆,这样就得到了一个堆顶元素小于任意一个堆里的元素
2 将剩下的一半元素依次与堆顶元素比较。若比堆顶元素大,则替换之,并调整堆。(也就是说:依次遍历剩下一般的元素,与当前的堆顶元素作比较,如果大于堆顶元素,则替换,这时,重新调整堆的结构,使其保持为最小堆,否则,遍历下一个元素,知道剩下的一半元素遍历结束)
3 数组剩下的所有元素比较完后,可以输出中位数。数组长度为奇数时,输出堆顶元素即可。数组长度为偶数时,输出堆顶元素与它的孩子结点中较小的那个的均值。
解法:
# -*- coding:utf-8 -*-
from heapq import *
class Solution:
def __init__(self):
self.heaps = [],[]
def Insert(self, num):
small,large = self.heaps
heappush(small,-heappushpop(large,num))
if len(large) < len(small):
heappush(large,-heappop(small))
def GetMedian(self, n = None):
small,large = self.heaps
if len(large) > len(small):
return float(large[0])
return (large[0] - small[0])/2.0