此题用堆来做比较简单。
左边放一个大顶堆 右边放一个小顶堆
当有新数据来的时候,两个堆循环着放。
例如第一个数据,我们放到大顶堆,但是要注意,这个新的数据假如比小顶堆的最小值大,就要交换该数据和小顶堆的头部,让新数据成为小顶堆头部,原来的头部放到大顶堆中。
下一个数据放到小顶堆,但是要注意,如果这个新的数据比大顶堆的最大值小,就要交换。
import java.util.*;
public class Solution {
private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->o2-o1);
private int count = 0;
public void Insert(Integer num) {
//一个放大顶堆 一个放小顶堆
if(count%2==0){ //放在小顶堆
//如果插入的数字比大顶堆的元素小
if(!maxHeap.isEmpty()&&maxHeap.peek()>num){ //让大顶堆的头和这个数字交换位置
int oldmax = maxHeap.poll();
maxHeap.add(num);
num = oldmax;
}
//更新之后的num放在小顶堆
minHeap.add(num);
}else{ //往大顶堆插
if(!minHeap.isEmpty()&&minHeap.peek()<num){
int oldmin = minHeap.poll();
minHeap.add(num);
num = oldmin;
}
maxHeap.add(num);
}
count++;
}
public Double GetMedian() {
int size = minHeap.size()+maxHeap.size();
if(size==0){
return 0.0;
}
if(size%2==0){
return (minHeap.peek()+maxHeap.peek())/2.0;
}
else{
return Double.valueOf(minHeap.peek());
}
}
}