您的位置:首页 > 运维架构

18.9 随机生成一些数字并传入某个插入方法。 编写一个程序,高效地插入过的元素的维护中位数。

2014-08-26 17:07 776 查看
按照题意,要实现两个方法: addNewNumer(int num) 和 getMedian()

维护两个priority queue:maxHeap 和 minHeap。

maxHeap中存放小于中位数的元素,minHeap中存放大于中位数的元素。并且保证两个堆里元素数量相等或者max比min多一个。

import java.util.Comparator;
import java.util.PriorityQueue;

public class Median {

PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(10, new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
return y.compareTo(x);
}
});
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();

public void addNewNumber(int num) {
if (maxHeap.size() == minHeap.size()) {
if (!minHeap.isEmpty() && num > minHeap.peek()) {
maxHeap.add(minHeap.remove());
minHeap.add(num);
} else {
maxHeap.add(num);
}

} else {
if (num < maxHeap.peek()) {
minHeap.add(maxHeap.remove());
maxHeap.add(num);
} else {
minHeap.offer(num);
}

}

}

public double getMedian() {
if (maxHeap.isEmpty())
return 0;
if (maxHeap.size() == minHeap.size())
return (double) (minHeap.peek() + maxHeap.peek()) / 2;
else
return maxHeap.peek();

}

public static void main(String[] args) {
Median m = new Median();
m.addNewNumber(1);
System.out.println(m.getMedian());

m.addNewNumber(3);
System.out.println(m.getMedian());

m.addNewNumber(4);
System.out.println(m.getMedian());

m.addNewNumber(5);
System.out.println(m.getMedian());

m.addNewNumber(2);
System.out.println(m.getMedian());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐