题解 | #数据流中的中位数#

数据流中的中位数

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1

# -*- coding:utf-8 -*-
class Solution:
    record=[]
    record_min=[] # dagen
    record_max=[] # xiaogen
    def Insert(self, num):
        self.record.append(num )
        # 形成一个小跟堆
        # 每次先往min里面放一个
        self.record_min.append(num)
        for i in range(len(self.record_min),-1,-1):
            self.makeheap_min(i)
        # 插入之后,把最大的弹过去
        tmp=self.record_min[0]
        self.record_min[0]=self.record_min[-1]
        self.record_min.pop(-1)
        self.makeheap_min(0)
        self.record_max.insert(-1,tmp)
        for i in range(len(self.record_max),-1,-1):
            self.makeheap_max(i)
        # 如果min比max少一个,就把max中最小的弹回来
        if len(self.record_min)-len(self.record_max)<0:
            tmp=self.record_max[0]
            self.record_max[0]=self.record_max[-1]
            self.record_max.pop(-1)
            self.makeheap_max(0)
            self.record_min.insert(-1,tmp)
            for i in range(len(self.record_min),-1,-1):
                self.makeheap_min(i)





        # write code here
    def GetMedian(self):
        # write code here
        if len(self.record)%2==0:
            # oushu
            return (self.record_max[0]+self.record_min[0])/2
        else:
             return self.record_min[0]

        

    def makeheap_max(self,idx): # xiaogen
        maxNode=len(self.record_max)-1
        l=2*idx+1
        r=2*idx+2
        if l>maxNode:
            return
        elif r>maxNode:
            if self.record_max[idx]>self.record_max[l]: # 互换位置
                tmp=self.record_max[idx]
                self.record_max[idx]=self.record_max[l]
                self.record_max[l]=tmp
                self.makeheap_max(l)
        else:
            if self.record_max[l]<=self.record_max[r]:
                if self.record_max[l]>self.record_max[idx]:
                    return
                else:
                    tmp=self.record_max[idx]
                    self.record_max[idx]=self.record_max[l]
                    self.record_max[l]=tmp
                    self.makeheap_max(l)
            else:
                if self.record_max[r]>self.record_max[idx]:
                    return
                else:
                    tmp=self.record_max[idx]
                    self.record_max[idx]=self.record_max[r]
                    self.record_max[r]=tmp
                    self.makeheap_max(r)

    def makeheap_min(self,idx): # dagen
        maxNode=len(self.record_min)-1
        l=2*idx+1
        r=2*idx+2
        if l>maxNode:
            return
        elif r>maxNode:
            if self.record_min[idx]<=self.record_min[l]: # 互换位置
                tmp=self.record_min[idx]
                self.record_min[idx]=self.record_min[l]
                self.record_min[l]=tmp
                self.makeheap_min(l)
        else:
            if self.record_min[l]>=self.record_min[r]:
                if self.record_min[l]<self.record_min[idx]:
                    return
                else:
                    tmp=self.record_min[idx]
                    self.record_min[idx]=self.record_min[l]
                    self.record_min[l]=tmp
                    self.makeheap_min(l)
            else:
                if self.record_min[r]<=self.record_min[idx]:
                    return
                else:
                    tmp=self.record_min[idx]
                    self.record_min[idx]=self.record_min[r]
                    self.record_min[r]=tmp
                    self.makeheap_min(r)




全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务