题解 | #数据流中的中位数#TOP48
思路:
1.暴力破解法,每次插入的时候,都for循环遍历找到num位置该存放的位置,然后插入
2.堆。用大根堆存放中位数左边的数,小根堆存放右边的数。大根堆的最大数小于小根堆的最小数
3.第一个数,先放入大根堆,然后再取出最大的数放在小根堆里。第二个数,先放入小根堆里,然后取出最小的数,放在大根堆里。第三个数,先放入大根堆,再取出最大的数,放入到小根堆。这种奇数位的数据,直接取小根堆的堆顶就可以了。偶数位那就两者平均。
4.每次存放数据时,做到将数据平均,所以有第1个数放到大根堆,取出来放到小根堆。第二个反之。每次先放再取,主要是取最小值和最大值
import java.util.*;
public class Solution {
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
return o2 - o1;
}
});
int count = 0;
public void Insert(Integer num) {
if(count % 2 == 0){
//已经偶数个 放到
maxHeap.offer(num);
int temp = maxHeap.poll();
minHeap.offer(temp);
}else{
minHeap.offer(num);
int temp = minHeap.poll();
maxHeap.offer(temp);
}
count ++;
}
public Double GetMedian() {
if(count % 2 == 0){
return new Double(minHeap.peek() + maxHeap.peek() ) / 2;
}else{
return new Double(minHeap.peek());
}
}
}