Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.html
For example,less
[2,3,4]
, the median is 3
ide
[2,3]
, the median is (2 + 3) / 2 = 2.5
函数
Design a data structure that supports the following two operations:spa
Example:code
addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2
中位数是有序列表中间的数。若是列表长度是偶数,中位数则是中间两个数的平均值。htm
很明显咱们最好不要每调用一次求中位数函数就从新计算一遍,这样作时间复杂度较高。blog
剑指offer中有一道相同的题目,能够参考这篇理解这道题,剑指Offer-63.数据流中的中位数(C++/Java)。element
C++get
class MedianFinder { public: /** initialize your data structure here. */ MedianFinder() { index = 0; } void addNum(int num) { if(index % 2 == 0){ minHeap.push(num); maxHeap.push(minHeap.top()); minHeap.pop(); } else{ maxHeap.push(num); minHeap.push(maxHeap.top()); maxHeap.pop(); } index++; } double findMedian() { double res = 0; if(index % 2 == 0){ res = (double)(maxHeap.top() + minHeap.top()) / 2; return res; } else{ res = (double)maxHeap.top(); return res; } } private: priority_queue <int, vector<int>, less<int> > maxHeap; priority_queue <int, vector<int>, greater<int> > minHeap; int index; };
Java
class MedianFinder { /** initialize your data structure here. */ public MedianFinder() { minHeap = new PriorityQueue<Integer>(); maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ @Override public int compare(Integer i1,Integer i2){ return i2-i1; } }); index = 0; } public void addNum(int num) { if(index % 2 == 0){ minHeap.offer(num); maxHeap.offer(minHeap.poll()); } else{ maxHeap.offer(num); minHeap.offer(maxHeap.poll()); } index++; } public double findMedian() { double res = 0; if(index % 2 == 0){ res = (minHeap.peek() + maxHeap.peek()) / 2.0; return res; } else{ res = maxHeap.peek(); return res; } } private PriorityQueue<Integer> minHeap; private PriorityQueue<Integer> maxHeap; private int index; }