1、原题如下:
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.
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.
For example:
add(1)
add(2)
findMedian() -> 1.5
add(3)
findMedian() -> 2
2、解答如下:
class MedianFinder {
public:
priority_queue<int> less;
priority_queue<int,vector<int>,greater<int>> bigger;
//这里用两个priority_queue来存储,头文件functional不要忘记添加,less表示递减的且二分较小的队列,bigger表示递增且二分较大的队列
void addNum(int num) {
if(!less.empty()&&less.top()>num)
{//如果less中的最大值比num大,num就需要被放到二分较小的队列,即less队列中
less.push(num);
if(less.size()>bigger.size())
{//为了保证二分,我们进行下面的判断,一旦less队列的size比bigger队列的大,我们就把less中最大的交给bigger
bigger.push(less.top());
less.pop();
}
}
else
{//如果num本身大于less中的最大值,我们就要把它放入bigger中
bigger.push(num);
if(bigger.size()-less.size()==2)
{//这里也是保证二分,一旦bigger的size比less大2,就把bigger中最小的给less
less.push(bigger.top());
bigger.pop();
}
}
}
// 从上面的添加方式可以看出,最后的结果无非bigger跟less的size相等,或者bigger多一个,分别对应有单独中间数或者两个中间数的情况,分别写出他们的值即可
double findMedian() {
if(bigger.size()==less.size())
{
return less.top()+(bigger.top()-less.top())/2.0;
}
else
return bigger.top();
}
};
3、总结
(1)本题需要的头文件
#include<queue>
#include<algorithm>
#include<functional>
#include<vector>
(2)priority_queue
priority_queue::push();//按照优先级插入
priority_queue::pop();//删除队列的开头
priority_queue::empty();//判断是否为空
priority_queue::top();//队列的开头
priority_queue::size();//队列的长度(大小)