数据流中位数-堆

数据流中的中位数

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=11216&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

'''老老实实本本分分用两个堆来实现'''
class Solution:
    def __init__(self):
        self.minNums=[] # 小根堆,其实存放的是最大的一半的数
        self.maxNums=[] # 大根堆,其实存放的是最小的一半的数
    def maxHeapInsert(self,num):
        self.maxNums.append(num) 
        i = len(self.maxNums)-1
        while i > 0 :
            if self.maxNums[i]>self.maxNums[(i-1)//2]:
                       # 堆的调整,如果加入的数大于其父节点的数,则交换位置
                t = self.maxNums[(i-1)//2]
                self.maxNums[(i-1)//2] = self.maxNums[i]
                self.maxNums[i] = t
                i = (i-1)//2 # 调整后的位置
            else: 
                break
    def maxHeapPop(self):
        t = self.maxNums[0] # 返回根节点,大根堆最大值
        self.maxNums[0] = self.maxNums[-1]
        self.maxNums.pop()
        lens = len(self.maxNums)
        i = 0
        while 2*i+1<lens:
            nexti = 2*i+1 #获得左孩子
            # 判断右孩子,选择最大的孩子节点值,交换位置
            if (nexti + 1 < lens) and self.maxNums[nexti + 1] > self.maxNums[nexti]:
                nexti +=1
            if self.maxNums[nexti]>self.maxNums[i]:
                tmp = self.maxNums[i]
                self.maxNums[i] = self.maxNums[nexti]
                self.maxNums[nexti] = tmp
                i = nexti
            else:break
        return t
    
    
    def minHeapInsert(self,num):
        self.minNums.append(num)
        lens = len(self.minNums)
        i = lens - 1
        while i > 0:
            if self.minNums[i] < self.minNums[(i - 1) // 2]:
                t = self.minNums[(i - 1) // 2]
                self.minNums[(i - 1) // 2] = self.minNums[i]
                self.minNums[i] = t
                i = (i - 1) // 2
            else:
                break
    def minHeapPop(self):
        t = self.minNums[0]
        self.minNums[0] = self.minNums[-1]
        self.minNums.pop()
        lens = len(self.minNums)
        i = 0
        while 2*i+1<lens:
            nexti = 2*i+1
            if (nexti+1<lens) and self.minNums[nexti] > self.minNums[nexti+1]:
                nexti += 1
            if self.minNums[nexti]<self.minNums[i]:
                tmp = self.minNums[i]
                self.minNums[i] = self.minNums[nexti]
                self.minNums[nexti] = tmp
                i = nexti
            else:
                break
        return t
    
    def Insert(self,num):
        if (len(self.minNums)+len(self.maxNums))&1==0:
            #长度为偶数,将大顶堆最大数放入小顶堆,也就是轮流着给堆插入值,先小后大
            if len(self.maxNums)>0 and num<self.maxNums[0]:
                self.maxHeapInsert(num)
                num = self.maxHeapPop()
            self.minHeapInsert(num)
        
        else: #总长度为奇数,将小顶堆最小数放入大顶堆
            if len(self.minNums)>0 and num>self.minNums[0]:
                self.minHeapInsert(num)
                num = self.minHeapPop()
            self.maxHeapInsert(num)
            
    def GetMedian(self):
        alllen = len(self.minNums)+len(self.maxNums)
        if alllen == 0:
            return -1
        if alllen & 1 == 1: # 总长度为奇数,小顶堆数量多1
            return self.minNums[0]
        else: # 总长度为偶数
            return (self.minNums[0]+self.maxNums[0])/2.0
        

全部评论

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
oppo 应用软开 22*15+0.5*12
拿到了ssp完美:真的坎坷,但是你至少拿到这么多offer了!
点赞 评论 收藏
分享
评论
1
收藏
分享
正在热议
# 25届秋招总结 #
443173次浏览 4517人参与
# 春招别灰心,我们一人来一句鼓励 #
42122次浏览 537人参与
# 北方华创开奖 #
107467次浏览 600人参与
# 地方国企笔面经互助 #
7973次浏览 18人参与
# 同bg的你秋招战况如何? #
77083次浏览 569人参与
# 实习必须要去大厂吗? #
55804次浏览 961人参与
# 阿里云管培生offer #
120406次浏览 2220人参与
# 虾皮求职进展汇总 #
116163次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11668次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2454912次浏览 34860人参与
# 提前批简历挂麻了怎么办 #
149924次浏览 1978人参与
# 在找工作求抱抱 #
906075次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4762次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196021次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157643次浏览 2267人参与
# 双非本科求职如何逆袭 #
662359次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12798次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35896次浏览 384人参与
# 简历中的项目经历要怎么写? #
86935次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20148次浏览 240人参与
# 我的上岸简历长这样 #
452049次浏览 8089人参与
牛客网
牛客企业服务