Examples:
[2,3,4]
, the median is 3
[2,3]
, the median is (2 + 3) / 2 = 2.5
Design a data structure that supports the following two operations:
- void addNum(int num) - Add a integer number from the data stream to the data structure.
- double findMedian() - Return the median of all elements so far.
add(1) add(2) findMedian() -> 1.5 add(3) findMedian() -> 2
class MedianFinder {
PriorityQueue<Integer> minQueue = new PriorityQueue<Integer>();
PriorityQueue<Integer> maxQueue = new PriorityQueue<Integer>(new Comparator<Integer>() {
public int compare(Integer i1, Integer i2) {
return i2.intValue() - i1.intValue();
}
});
// maxQueue + minQueue
// Adds a number into the data structure.
public void addNum(int num) {
if (maxQueue.size() == 0 || num < maxQueue.peek()) {
maxQueue.add(num);
} else {
minQueue.add(num);
}
if (maxQueue.size() - minQueue.size() == 2) {
minQueue.add(maxQueue.poll());
} else if (minQueue.size() - maxQueue.size() == 2) {
maxQueue.add(minQueue.poll());
}
}
// Returns the median of current data stream
public double findMedian() {
if (maxQueue.size() == minQueue.size()) {
return (maxQueue.peek() + minQueue.peek()) * 1.0 / 2.0;
} else if (maxQueue.size() > minQueue.size()) {
return maxQueue.peek();
} else {
return minQueue.peek();
}
}
};
// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf = new MedianFinder();
// mf.addNum(1);
// mf.findMedian();
没有评论:
发表评论