JZ63-----数据流中的中位数
分析
- 中位数是位于有序数列的中间,奇数位即中间的数,偶数位的话,是中间两个数的平均值。
- 中位数的前面的数都比它小,后面的数都比他大。
- 中位数比前面数的最大值要大,比后面最小值要小。
所以我们只需要关心前面数据的最大值和后面数据的最小值===》想到堆结构、堆排序的特点;
数据结构分析
- 若对前半段的数建立大根堆,后半段的数建立小根堆;则中位数可以在两个堆的根中确定。
- 要使得两个堆的根可以确定中位数,需要满足两个堆的节点个数大小相等,或者相差一个。
操作分析
- 对大根堆插入奇数位的数字,对小根堆插入偶数位的个数
====》个数均匀,中位数才有可能在两根中取得。 - 要保证大根堆整体都要小于小根堆,才能保证中位数一定在两根中。
====》大根堆每次插入数据后,取大根堆的根放入小根堆;
小根堆每次插入后,取小根堆的根放入大根堆; - 当排序数字个数为偶数时,中位数是两根的平方和;
- 当为奇数时,中位数是小根堆的根;因为奇数时,先插入大根堆,所以大根堆个数多一个,但是每次插入后还会再取出放入小根堆,所以小根堆多一个;
关于堆可以采用Java中的优先队列PriorityQueue实现;堆排序的细节可以参考这一篇。
代码实现
import java.util.*;
public class Solution {
// PriorityQueue<Integer> max = new PriorityQueue<>((a,b)->b-a);
PriorityQueue