package com.daily.daily20210128;
import java.util.PriorityQueue;
/**
* @Project: dailyCode
* @Site: http://www.zhao1iang.club/
* @Copyright: ©CodeLamp
* @Author: zhaoliang
* @Create: 2021-01-28 16:15
* @Desc: 数据流中的中位数
**/
public class GetMedian {
//如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
//如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
//我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
//大顶堆存储左半边元素,
private PriorityQueue<Integer> left_queue = new PriorityQueue<>((o1, o2) -> o2-o1);
//小顶堆存储右半边元素
private PriorityQueue<Integer> right_queue = new PriorityQueue<>();
//当前数字个数
private int N;
public void Insert(Integer val){
if(N%2==0){
//偶数理应插入右半边,但是不一定大于左半边所有元素,
//所以先插入左半边大顶堆做判断、选出左侧最大的
left_queue.add(val);
right_queue.add(left_queue.poll());
}else {
right_queue.add(val);
left_queue.add(right_queue.poll());
}
N++;
}
public Double getMedian(){
if (N%2==0){
return (left_queue.peek()+right_queue.peek())/2.0;
}else {
return (double)right_queue.peek();
}
}
}
日常刷题-数据流中的中位数
最新推荐文章于 2024-04-26 17:29:19 发布