最新公告
  • 新注册用户请前往个人中心绑定邮箱以便接收相关凭证邮件!!!点击前往个人中心
  • 剑指Offer:数据流中的中位数

    题目描述

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

    解题思路

    package com.geekerstar.s64;
    
    import java.util.PriorityQueue;
    
    public class Solution {
        /* 大顶堆,存储左半边元素 */
        private PriorityQueue left = new PriorityQueue<>((o1, o2) -> o2 - o1);
        /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */
        private PriorityQueue right = new PriorityQueue<>();
        /* 当前数据流读入的元素个数 */
        private int N = 0;
    
        public void Insert(Integer val) {
            /* 插入要保证两个堆存于平衡状态 */
            if (N % 2 == 0) {
                /* N 为偶数的情况下插入到右半边。
                 * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大,
                 * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */
                left.add(val);
                right.add(left.poll());
            } else {
                right.add(val);
                left.add(right.poll());
            }
            N++;
        }
    
        public Double GetMedian() {
            if (N % 2 == 0)
                return (left.peek() + right.peek()) / 2.0;
            else
                return (double) right.peek();
        }
    }
    
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » 剑指Offer:数据流中的中位数

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 211会员总数(位)
    • 3737资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 869稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级