美文网首页剑指 Offer Java版剑指offer
剑指Offer Java版 面试题41:数据流中的中位数

剑指Offer Java版 面试题41:数据流中的中位数

作者: 孙强Jimmy | 来源:发表于2019-07-28 10:32 被阅读3次

    题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

    练习地址

    https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1

    参考答案

    import java.util.PriorityQueue;
    import java.util.Comparator;
    
    public class Solution {
        private PriorityQueue<Integer> mMinQueue = new PriorityQueue<>();
        private PriorityQueue<Integer> mMaxQueue = new PriorityQueue<>(11, new Comparator<Integer>() {
            @Override
            public int compare(Integer i1, Integer i2) {
                if (i1 < i2) {
                    return 1;
                } else if (i1 > i2) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
    
        public void Insert(Integer num) {
            if (((mMinQueue.size() + mMaxQueue.size()) & 1) == 0) {
                if (!mMaxQueue.isEmpty() && num < mMaxQueue.peek()) {
                    mMaxQueue.add(num);
                    num = mMaxQueue.poll();
                }
                mMinQueue.add(num);
            } else {
                if (!mMinQueue.isEmpty() && num > mMinQueue.peek()) {
                    mMinQueue.add(num);
                    num = mMinQueue.poll();
                }
                mMaxQueue.add(num);
            }
        }
    
        public Double GetMedian() {
            int size = mMinQueue.size() + mMaxQueue.size();
            if (size == 0) {
                return 0.0;
            }
            if ((size & 1) == 1) {
                return (double) mMinQueue.peek();
            } else {
                return (mMinQueue.peek() + mMaxQueue.peek()) / 2.0;
            }
        }
    }
    

    复杂度分析

    • 插入的时间复杂度:O(logn)。
    • 插入的空间复杂度:O(1)。
    • 得到中位数的时间复杂度:O(1)。
    • 得到中位数的空间复杂度:O(1)。

    👉剑指Offer Java版目录
    👉剑指Offer Java版专题

    相关文章

      网友评论

        本文标题:剑指Offer Java版 面试题41:数据流中的中位数

        本文链接:https://www.haomeiwen.com/subject/mueurctx.html