标签:queue err ble eof 平均值 ons 奇数 取数 记录
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
使用堆排序思想
public class Solution {
private PriorityQueue<Integer> min = new PriorityQueue<>(); //小顶堆
private PriorityQueue<Integer> max = new PriorityQueue<>(new Comparator<Integer>() {//大顶堆
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
//记录数据流个数
private int count = 0;
public void Insert(Integer num) {
count++; //个数+1
if(count%2 == 1){ //当数据流为奇数时
max.offer(num); //加入大顶堆
min.offer(max.poll()); //将大顶堆中最大值加入小顶堆
}else { //当数据流为偶数时
min.offer(num); //加入小顶堆
max.offer(min.poll()); //将小顶堆中最小值加入大顶堆
}
}
public Double GetMedian() {
if(count%2 == 0){ //当数据流为偶数时
return (min.peek() + max.peek()) / 2.0; //小顶堆最小值与大顶堆最大值的平均值
}else{ //当数据流为奇数时
return (double)min.peek(); //小顶堆的最小值
}
}
}
使用List集合暴力解决
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
public void Insert(Integer num) {
list.add(num);
Collections.sort(list);
}
public Double GetMedian() {
int n = list.size();
if (n % 2 == 0)
return Double.valueOf((list.get(n / 2) + list.get(n / 2 - 1)) / 2.0);
else
return Double.valueOf(list.get(n / 2));
}
}
标签:queue err ble eof 平均值 ons 奇数 取数 记录
原文地址:https://www.cnblogs.com/le-le/p/12866359.html