JZ63-----数据流中的中位数

JZ63-----数据流中的中位数

在这里插入图片描述

分析

  1. 中位数是位于有序数列的中间,奇数位即中间的数,偶数位的话,是中间两个数的平均值。
  2. 中位数的前面的数都比它小,后面的数都比他大。
  3. 中位数比前面数的最大值要大,比后面最小值要小。

所以我们只需要关心前面数据的最大值和后面数据的最小值===》想到堆结构、堆排序的特点;

数据结构分析
  1. 若对前半段的数建立大根堆,后半段的数建立小根堆;则中位数可以在两个堆的根中确定。
  2. 要使得两个堆的根可以确定中位数,需要满足两个堆的节点个数大小相等,或者相差一个。
操作分析
  1. 对大根堆插入奇数位的数字,对小根堆插入偶数位的个数
    ====》个数均匀,中位数才有可能在两根中取得。
  2. 要保证大根堆整体都要小于小根堆,才能保证中位数一定在两根中。
    ====》大根堆每次插入数据后,取大根堆的根放入小根堆;
    小根堆每次插入后,取小根堆的根放入大根堆;
  3. 当排序数字个数为偶数时,中位数是两根的平方和;
  4. 当为奇数时,中位数是小根堆的根;因为奇数时,先插入大根堆,所以大根堆个数多一个,但是每次插入后还会再取出放入小根堆,所以小根堆多一个;

关于堆可以采用Java中的优先队列PriorityQueue实现;堆排序的细节可以参考这一篇

代码实现

import java.util.*;
public class Solution {
   
   // PriorityQueue<Integer> max = new PriorityQueue<>((a,b)->b-a);
  PriorityQueue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值