解法一:
这个题是很有趣的一个题,目标是维护中位数,所以需要两个堆的数据结构。最大堆存较小的那部分,最小堆存较大的那部分,堆顶的就是中位数。
这里有一个难点就是什么时候prune,以及什么时候维持平衡。重点是一定要始终让一个堆最大,否则prune会出很多问题,此处让最大堆始终比最小堆多一个,在添加和删除后直接维持一次平衡然后prune就行,但这个prune必须保证先prune最大堆,再prune最小堆。
主程序部分直接用双指针模板就好。
from heapq import *
from collections import defaultdict
class Solution:
def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
# 总让最大堆的元素更多
class M:
def __init__(self, nums, k):
self.delayed = defaultdict(int)
self.maxheap = []
self.minheap = []
heapify(self.maxheap)
heapify(self.minheap)
# init
for i in range(k):
heappush(self.maxheap, -nums[i])
# 让两边平衡
for i in range(k // 2):
heappush(self.minheap, -heappop(self.maxheap))
self.balance = len<