先排序后求解这样能过:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.data = []
def Insert(self, num):
# write code here
self.data.append(num)
self.data.sort()
def GetMedian(self, data):
# write code here
length = len(self.data)
return self.data[length//2] if length%2 == 1 else\
(self.data[(length//2)-1]+self.data[(length//2)])/2.0
可以建立一个大顶堆加一个小顶堆,分别存放较小和较大数据:
当两个堆数据个数为偶数的时候,把数存入最大堆,然后重排最大堆,如果最大堆的堆顶数字大于最小堆堆顶数字,则把两个堆顶数字交换,重排两堆,此时两堆数字总数为奇数,直接输出最大堆堆顶数字即为中位数;
当两堆数据总数为奇数的时候,把数存入最小堆,重排最小堆,如果最大堆的堆顶数字大于最小堆堆顶数字,则把两个堆顶数字交换,重排两堆,此时两堆数字总数为偶数,取两堆堆顶数字做平均即为中位数。
在这里大小堆不必分别构造,构造一个另外一个变换符号即可用:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.small = [] # 小的数,大顶堆
self.big = [] # 大的数,小顶堆
self.count = 0 # 计数
def Insert(self, num):
# write code here
if self.count%2 == 0:
self.small.append(num)
else:
self.big.append(-num)
self.count += 1
def GetMedian(self, a):
# write code here
if self.count == 1:
return self.small[0]
self.maxheap(self.small)
self.maxheap(self.big) # 用大顶堆构建小顶堆,变符号就行
if self.small[0] > -self.big[0]:
self.small[0], self.big[0] = -self.big[0], -self.small[0]
self.maxheap(self.small)
self.maxheap(self.big)
if self.count%2 == 1:
return self.small[0]
else:
return (self.small[0]-self.big[0])/2.0
def maxheap(self, data): # 构建最大堆
for start in range(len(data)//2-1, -1, -1):
root = start
while True:
child = 2*root + 1
if child >= len(data): # 无子节点
break
if child+1 < len(data) and data[child+1] > data[child]:
child += 1 # 找较大子节点
if data[root] < data[child]:
data[root], data[child] = data[child], data[root]
root = child
else:
break
return data