NC随时找到数据流的中位数
思路:
1、准备一个大根堆,一个小根堆
2、一个新进来的数,如果比大根堆堆顶大,进小根堆;
比大根堆堆顶小,进大根堆
3、如果两个堆长度差2,弹出堆顶进对面堆
4、最后中位数必在两个堆顶中
//创建小根堆
PriorityQueue <Integer> minHeap = new PriorityQueue<>();
//创建大根堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->(o2-o1));
import java.util.*;
public class Solution {
/**
* the medians
* @param operations int整型二维数组 ops
* @return double浮点型一维数组
*/
private PriorityQueue <Integer> minHeap = new PriorityQueue<>();
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->(o2-o1));
public double[] flowmedian (int[][] operations) {
// write code here
ArrayList<Double> arr = new ArrayList<>();
for(int[] op : operations){
if(op[0]==1){
if(maxHeap.isEmpty() || maxHeap.peek()>op[1]){
maxHeap.add(op[1]);
}
else{
minHeap.add(op[1]);
}
if(minHeap.size() == maxHeap.size()+2){
maxHeap.add(minHeap.poll());
}
if(minHeap.size()+2 == maxHeap.size()) {minHeap.add(maxHeap.poll());
}
}
else{
if(maxHeap.size()==0){
double ans=-1;
arr.add(ans);
continue;
}
if(maxHeap.size() == minHeap.size()){
double num1=maxHeap.peek();
double num2=minHeap.peek();
arr.add((num1+num2)/2);
}
else if(maxHeap.size() > minHeap.size()){
double num1 = maxHeap.peek();
arr.add(num1);
}else{
double num1 = minHeap.peek();
arr.add(num1);
}
}
}
double[] arrs=new double[arr.size()];
for(int i=0;i<arr.size();i++){
arrs[i]=arr.get(i);
}
return arrs;
}
}