剑指offer 41 数据流中的中位数

本文介绍了如何在数据流中实时计算中位数,使用Python的heapq库构建最大值堆和最小值堆。当数据流中的数值增加时,通过调整堆保持平衡,确保在O(nlogn)的时间复杂度和O(n)的空间复杂度下,能快速获取当前的中位数。
摘要由CSDN通过智能技术生成

描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

数据范围:数据流中数个数满足
1≤n≤1000 ,大小满足 1≤val≤1000
进阶: 空间复杂度 O(n) , 时间复杂度 O(nlogn)
示例1
输入:
[5,2,3,4,1,6,7,0,8]
返回值:
"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "

说明:
数据流里面不断吐出的是5,2,3…,则得到的平均数分别为5,(5+2)/2,3…
示例2
输入:
[1,1,1]
返回值:
"1.00 1.00 1.00 "

思路:可以用一个最大值堆和最小值堆可存一半的数据

# -*- coding:utf-8 -*-
import heapq
class Solution:
    def __init__(self):
        self.minHeap = []   # 最小值堆(堆顶最小, 存放较大的另一半数据)
        self.maxHeap = []   # 最大值对(堆顶最大,存放较小的另一半数据), 数乘 -1 用最小堆实现

    def Insert(self, num):
        # write code here
        heapq.heappush(self.maxHeap, -1*num)
        #### 保证最小值堆的元素个数和最大值堆相同, 或多一个
        if len(self.maxHeap) > len(self.minHeap):
            top = heapq.heappop(self.maxHeap)*-1
            heapq.heappush(self.minHeap, top)
        elif len(self.maxHeap) == len(self.minHeap): #保证最小值堆的最小值>=最大值堆的最大值
            if -1*self.maxHeap[0] > self.minHeap[0]:
                temp1 = -1*heapq.heappop(self.maxHeap)
                temp2 = heapq.heappop(self.minHeap)
                heapq.heappush(self.maxHeap, -1*temp2)
                heapq.heappush(self.minHeap, temp1)
        
    def GetMedian(self):
        # write code here
        if len(self.minHeap) == len(self.maxHeap):
            return (self.minHeap[0]-self.maxHeap[0])/2
        else:
            return self.minHeap[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值