leetcode: Find Median from Data Stream

实际上使用两个队列,保证每个队列顶部恰好是中间的两个值(若large大小大于small,则说明奇数个数字,large的顶部是中间值)...保证 这个利用preority queue始终有序的特性...只需保证large的大小永远大于等于small,每次将最小的数给small;而small存数的负数形式(使得顶部最小元素即为实际的最大元素),每次将最大的值给large....这样large中始终存储大得那一半,small中是小的那一半,且二者的顶部最小值恰好是待求得median



class MedianFinder {

    // Adds a number into the data structure.
    Queue<Long> small = new PriorityQueue(),
                large = new PriorityQueue();
    public void addNum(int num) {
        large.add((long)num);
        small.add(-large.poll());
        if( large.size()<small.size() )
        {
            large.add(-small.poll());
        }
    }

    // Returns the median of current data stream
    public double findMedian() {
        if( large.size()>small.size() )
        {
            return large.peek();
        }
        return (double)((large.peek()-small.peek())/2.0);
        
    }
};

// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf = new MedianFinder();
// mf.addNum(1);
// mf.findMedian();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值