Leetcode 数据流的中位数

leetcode

问题

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

思路

由于数组是动态的,不断会有新的数据加入,如果每次都进行重新排序会很麻烦,考虑能维持有序的结构,平衡的二叉搜索树:左节点的值<根节点<右节点, 根节点为中位数
平衡二叉搜索树的实现较为复杂,可以考虑转换成更容易的顶堆
平衡二叉搜索树的左子树均小于根节点,右子树均大于根节点,可以考虑将左子树构造一个大顶堆,右子树构造小顶堆,同时满足大顶堆的最大值小于小顶堆的最小值

  • 堆的相关知识:1
    2
    3

最大堆储存n+1/n个元素,最小堆储存n个元素
每当有新的数据流入,先将其添加到最大堆,然后取出最大堆的堆顶元素,添加到最小堆,如果现在所有元素个数为奇数个,为保持最大堆个数大于最小堆,取出最小堆的堆顶元素加入最大堆,反之不做任何操作

import heapq
class MedianFinder:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.count = 0
        self.minh = []
        self.maxh = []



    def addNum(self, num: int) -> None:
        self.count +=1
        heapq.heappush(self.maxh,-num)
        max_top = heapq.heappop(self.maxh)
        heapq.heappush(self.minh,-max_top)
        if self.count & 1:
            min_top = heapq.heappop(self.minh)
            heapq.heappush(self.maxh,-min_top)



    def findMedian(self) -> float:
        if self.count&1:
            return -self.maxh[0]
        else:
            return (self.minh[0]-self.maxh[0])/2


你可能感兴趣的:(刷题)