1 public class MedianFinder { 2 private PriorityQueue<Integer> maxQueue; 3 private PriorityQueue<Integer> minQueue; 4 5 public MedianFinder() { 6 maxQueue = new PriorityQueue<>(Collections.reverseOrder()); 7 minQueue = new PriorityQueue<>(); 8 } 9 10 // Adds a number into the data structure. 11 public void addNum(int num) { 12 maxQueue.offer(num); 13 minQueue.offer(maxQueue.poll()); 14 if (maxQueue.size() < minQueue.size()) { 15 maxQueue.offer(minQueue.poll()); 16 } 17 } 18 19 // Returns the median of current data stream 20 public double findMedian() { 21 if (maxQueue.size() != minQueue.size()) { 22 return maxQueue.peek(); 23 } 24 return (double)(maxQueue.peek() + minQueue.peek()) / 2.0; 25 } 26 }; 27 28 // Your MedianFinder object will be instantiated and called as such: 29 // MedianFinder mf = new MedianFinder(); 30 // mf.addNum(1); 31 // mf.findMedian();