编程练习-数据流中的中位数
这里要注意的是数据流,而不是固定的数组,因此无法进行排序得出中位数,可以使用两个堆结构来实现,一个最大堆来存数据流中较小的数据,一个最小堆来存数据流中较大的数据,这样一来,中位数不是最大堆的堆顶数就是最小堆的堆顶数,要不就是两个堆顶和除以二。
代码思路:
java中的PriorityQueue
是基于堆实现的,可以通过传入不同的比较器来实现最大堆和最小堆,这里的比较器Comparator
使用的是策略模式。
代码实现:
import java.util.*;
public class Solution {
private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
public void Insert(Integer num) {
if(maxHeap.size()==0){
maxHeap.offer(num);
return;
}
if(minHeap.size()==0){
if(num>maxHeap.peek())
minHeap.offer(num);
else{
minHeap.offer(maxHeap.poll());
maxHeap.offer(num);
}
return;
}
if(maxHeap.size()<=minHeap.size()){
if(num<maxHeap.peek())
maxHeap.offer(num);
else{
minHeap.offer(num);
maxHeap.offer(minHeap.poll());
}
}else{
if(num>minHeap.peek())
minHeap.offer(num);
else{
maxHeap.offer(num);
minHeap.offer(maxHeap.poll());
}
}
}
public Double GetMedian() {
if(minHeap.size()<maxHeap.size())
return (double)(maxHeap.peek());
if(minHeap.size()>maxHeap.size())
return (double)(minHeap.peek());
return (double)(minHeap.peek()+maxHeap.peek())/2;
}
}