Leetcode 295. Find Median from Data Stream

这道题需要用一个最大堆和最小堆维护数组,满足最大堆的值<=最小堆的值,且最大堆数量 = 最小堆数量/最小堆数量+1。这样就能直接利用最大堆和最小堆顶部的数字得到中位数。

添加时:

1. 如果最大堆数量 = 最小堆数量,则应该增加最大堆数量

      case 1. 添加的元素<=最大堆顶部元素,可以直接添加入最大堆

      case 2. 添加的元素>最大堆顶部元素,需要将其添加入最小堆,并将最小堆pop出一个元素移到最大堆

2.如果最大堆数量 = 最小堆数量 + 1,则应该增加最小堆数量

      case 1. 添加的元素>=最大堆顶部元素,可以直接添加入最小堆

      case 2. 添加的元素<最大堆顶部元素,需要将其添加入最大堆,并将最大堆pop出一个元素移到最小堆

from Queue import PriorityQueue as PQ
class MedianFinder(object):
    # 查看pq最顶端的元素
    def top(self, pq):
        temp = pq.get()
        pq.put(temp)
        return temp
    

    def __init__(self):
        """
        initialize your data structure here.
        """
        # 保证maxQueue数量在[minQueue, minQueue+1]之间
        self.maxQueue = PQ()
        self.minQueue = PQ()
        

    def addNum(self, num):
        """
        :type num: int
        :rtype: None
        """
        
        if self.maxQueue.qsize() == self.minQueue.qsize():
            if self.maxQueue.qsize() == 0 or num <= self.top(self.maxQueue):
                self.maxQueue.put(-num)
            else:
                self.minQueue.put(num)
                temp = self.minQueue.get()
                self.maxQueue.put(-temp)
        else:
            if num >= -self.top(self.maxQueue):
                self.minQueue.put(num)
            else:
                self.maxQueue.put(-num)
                temp = self.maxQueue.get()
                self.minQueue.put(-temp)
        

    def findMedian(self):
        """
        :rtype: float
        """
        if self.maxQueue.qsize() != self.minQueue.qsize():
            temp = self.maxQueue.get()
            self.maxQueue.put(temp)
            return -temp
        else:
            temp1 = self.maxQueue.get()
            self.maxQueue.put(temp1)
            temp2 = self.minQueue.get()
            self.minQueue.put(temp2)
            return (-temp1 + temp2) / 2.0

# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值