前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer_12_数据流中的中位数

剑指offer_12_数据流中的中位数

作者头像
用户6055494
发布2019-10-14 15:35:26
2590
发布2019-10-14 15:35:26
举报
文章被收录于专栏:AVAJ
题目:数据流中的中位数

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

方法一:排好序判断个数,然后得出中位数,这里代码就不写啦。

方法二:构建一个大顶堆和一个小顶堆,把数据流中的数据分别放到这俩个堆中,保证大顶堆的数据都小于小顶堆的数据,这样不用排序也能获取到中位数。代码如下:

代码语言:javascript
复制
// 优先队列默认是小顶堆
staticPriorityQueue<Integer> minHeap = new PriorityQueue();
// 重写比较器让他变成大顶堆
staticPriorityQueue<Integer> maxHeap = new PriorityQueue((o1,o2)->(Integer)o2 - (Integer)o1);
// 用于计数,让俩个堆插入数据时持平
staticint count = 0;
public static void add(Integer number) {

    if (count % 2 == 0) {
        // 为了使小顶堆里的数据都比大顶堆的数据大 每次插入都要进行操作
        minHeap.add(number);
        // 加入的元素为基数时大顶堆 要多一个元素 根就是中位数了
        maxHeap.add(minHeap.poll());
    } else {
        maxHeap.add(number);
        minHeap.add(maxHeap.poll());
    }
    count ++;

}
public static double getMedian() {
    if (count % 2 == 0) {
        return (minHeap.peek() +maxHeap.peek()) / 2.0;
    } else {
        // 为计数时大顶堆的根就是中位数 因为大顶堆多一个元素
        return (double)maxHeap.peek();
    }
}

public static void main(String[] args) {
    add(1);
    add(2);
    System.out.println(getMedian()); // 1.5
    add(3);
    System.out.println(getMedian()); // 2.0
}

总结:利用几何的特点,有时候可以很快找到答案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档