剑指offerJZ63-数据流中位数(常见数据结构复杂度)

思路
① 需要一个数据容器来保存从流中读出来的数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
补充知识:无序数组中位数
解法一:先排序再找中位数
解法二:小根堆(网上代码跑不了,堆排序不熟,不知道是那道题,只知道这样O(n))
思想是:
1 对无序数组的前len(array)//2长度的元素建立最小堆,这样就得到了一个堆顶元素小于任意一个堆里的元素
2 将剩下的一半元素依次与堆顶元素比较。若比堆顶元素大,则替换之,并调整堆。(也就是说:依次遍历剩下一般的元素,与当前的堆顶元素作比较,如果大于堆顶元素,则替换,这时,重新调整堆的结构,使其保持为最小堆,否则,遍历下一个元素,知道剩下的一半元素遍历结束)
3 数组剩下的所有元素比较完后,可以输出中位数。数组长度为奇数时,输出堆顶元素即可。数组长度为偶数时,输出堆顶元素与它的孩子结点中较小的那个的均值。

解法:

# -*- coding:utf-8 -*-
from heapq import *
class Solution:
    def __init__(self):
        self.heaps = [],[]
    def Insert(self, num):
        small,large = self.heaps
        heappush(small,-heappushpop(large,num))
        if len(large) < len(small):
            heappush(large,-heappop(small))
    def GetMedian(self, n = None):
        small,large = self.heaps
        if len(large) > len(small):
            return float(large[0])
        return (large[0] - small[0])/2.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值