【leetCode】Find Median from Data Stream

题意:设计一个数据结构,支持两个操作:插入数和找出该序列的中位数。也就是在一个不断增加的序列中找出中位数。

思路:用两个堆,一个大顶堆,一个小顶堆。每当来一个数时,如果这个数小于大顶堆的最大值,则插入大顶堆,否则插入小顶堆。如果这两个堆的大小不一样,则调配一下(偶数个数时两个堆的大小相等,奇数个数时大顶堆的大小-1=小顶堆)。中位数操作,对于奇数时,则是大顶堆的最大值,否则则是大顶堆的最大值加上小顶堆的最小值除以2。

代码:

class MedianFinder {
public:
    int size=0;
    priority_queue<int> big;
    priority_queue<int, vector<int>, greater<int> > small;
    // Adds a number into the data structure.
    void addNum(int num) {
        int t,b,s;
        size++;
        if(size==1) big.push(num);
        else if(num>big.top()) small.push(num);
        else big.push(num);
        if(size%2==0&&big.size()!=small.size() || size%2==1&&big.size()-1!=small.size())
        {
            if(big.size()>small.size())
            {
                t=big.top();
                big.pop();
                small.push(t);
            }
            else
            {
                t=small.top();
                small.pop();
                big.push(t);
            }
        }
    }

    // Returns the median of current data stream
    double findMedian() {
        if(size%2==0) return (big.top()+small.top())/2.0;
        return big.top();
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值