41 数据流中的中位数

题目

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

牛客网
AcWing OJ

C++ 题解

  • 创建一个最大堆和一个最小堆;
  • 元素依次添加到堆中:
    • 大顶堆中的元素都要比小顶堆中的元素小;
    • 如果是偶数个元素则保证两个堆中各存放一半元素;
    • 如果是奇数个元素则保证多出一个元素放在大顶堆;
  • 如果最小堆中数据容量较大,则直接返回最小堆的堆顶元素,否则返回两个堆的堆顶元素和的一半。
class Solution {
    priority_queue<int, vector<int>, less<int> > p; //大顶堆
    priority_queue<int, vector<int>, greater<int> > q; //小顶堆
     
public:
    void Insert(int num)
    {
        if(p.empty() || num <= p.top()) 
            p.push(num);
        else 
            q.push(num);
        
        // 大顶堆中元素个数比小顶堆元素个数大2,则恢复一下平衡
        if(p.size() == q.size() + 2) 
            q.push(p.top()), p.pop();
        // 大顶堆中的元素个数比小顶堆元素个数少一个,则将多的一个元素放到大顶堆中
        if(p.size() + 1 == q.size()) 
            p.push(q.top()), q.pop();
    }
    double GetMedian(){ 
      
      // 如果是偶数个元素,则返回大顶堆和小顶堆的堆顶元素和之一半
      // 如果是奇数个元素,则因为大顶堆中元素个数比小顶堆中的元素多一个,所以返回大顶堆的堆顶元素
      // 这里应该除以2.0,返回浮点类型
      return p.size() == q.size() ? (p.top() + q.top()) / 2.0 : p.top();
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.array=[]
        
    def Insert(self, num):
        # write code here
        self.array.append(num)
        self.array.sort()
        
    def GetMedian(self,M):
        # write code here
        length=len(self.array)
        if len(self.array)%2==1:
            return self.array[length//2]
        else:
            return (self.array[length//2-1]+self.array[length//2])/2.0
posted @ 2019-03-15 22:53  youngliu91  阅读(144)  评论(0)    收藏  举报