greater和less的用法
greater和less的用法
===================================================================
greater使内置类型从大到小排序,而less从小到大
注意:
sort用greater排序,则a[0]到a[n]有大到小排序。
priority_queue用greater排序,则先取出的是最小值。
295.数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
- void addNum(int num) - 从数据流中添加一个整数到数据结构中。
- double findMedian() - 返回目前所有元素的中位数。
实例
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2
进阶
- 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?
- 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?
思路和代码
使用两个优先队列 qMax
和 qMin
分别记录大于中位数的数和小于等于中位数的数。当累计添加的数的数量为奇数时,qMin
中的数的数量比 qMax
多一个,此时中位数为 queMin
的队头。当累计添加的数的数量为偶数时,两个优先队列中的数的数量相同,此时中位数为它们的队头的平均值。
class MedianFinder {
public:
priority_queue <int,vector<int>,greater<int> > qMax;
priority_queue <int,vector<int>,less<int> >qMin;
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) {
if(qMin.empty()||num<qMin.top()){
qMin.push(num);
if(qMax.size()+1<qMin.size()){
qMax.push(qMin.top());
qMin.pop();
}
}else{
qMax.push(num);
if(qMax.size()>qMin.size()){
qMin.push(qMax.top());
qMax.pop();
}
}
}
double findMedian() {
if(qMax.size()!=qMin.size()) return qMin.top();
return (qMin.top()+qMax.top())/2.0;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/