# -*- coding:utf-8 -*-
class Solution:
def __init__(self) -> None:
self.nums = []
# self.mid_nums = []
self.mid = 0
# 大顶堆
def adjust_max_heap(self, pos, length):
dad = pos
son = pos * 2 + 1
while son < length:
if son + 1 < length and self.nums[son+1] > self.nums[son]:
son += 1
if self.nums[dad] < self.nums[son]:
self.nums[dad], self.nums[son] = self.nums[son], self.nums[dad]
dad = son
son = dad * 2 + 1
else:
break
def Insert(self, num):
# write code here
self.nums.append(num)
n = len(self.nums)
if n == 1:
# self.mid_nums.append(num)
return
self.mid = n // 2
for i in range(n // 2 -1,-1,-1):
self.adjust_max_heap(i, n)
# 全堆排超时 只需要排一半就行
# -2 -3都行 -1 不行 左闭右开
for j in range(n-1,self.mid - 2,-1):
self.nums[0], self.nums[j] = self.nums[j], self.nums[0]
self.adjust_max_heap(0, j)
def GetMedian(self):
# write code here
n = len(self.nums)
if n == 1:
return self.nums[0]
if n % 2 == 0:
# 大堆 后面的才排序
return (self.nums[self.mid] + self.nums[self.mid - 1]) / 2
else:
return self.nums[self.mid]