class MedianFinder {
//大顶堆、小顶堆实现
//大根堆:较小元素、小根堆:较大元素
Queue<Integer> min, max;
/** initialize your data structure here. */
public MedianFinder() {
min = new PriorityQueue<>();
max = new PriorityQueue<>((x,y)->(y-x));
}
//添加元素
public void addNum(int num) {
//判断是否为偶数或奇数的情况
if (min.size() == max.size()){
min.add(num);
max.add(min.poll());
}else{
max.add(num);
min.add(max.poll());
}
}
public double findMedian() {
if (min.size() == max.size()){
return (min.peek() + max.peek())/2.0;
}else{
return max.peek() * 1.0;
}
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
共以下 17 个回答
优先队列 注意返回值
一个大根堆存 <= 中位数,一个小根堆存 > 中位数
思路:优先队列
下面代码
时间复杂度O(logn)
分别用大顶堆和小顶堆去存一半的数字
“`c++> qmax; //大顶堆, greater > qmin; //小顶堆
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue
priority_queue
MedianFinder() {
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
“`
时间:O(logn),空间:O(n)
//利用两个堆,将数组一分为二,前一半的数存到大根堆中,后一半的数存到小根堆中,这样的话就可以从两个堆的堆顶求取中位数
class cmpB{
public:
bool operator()(int& a,int& b){
return a>b;
}
};
class cmpA{
public:
bool operator()(int& a ,int& b){
return a<b;
}
};,cmpA> queA; ,cmpB> queB;
class MedianFinder {
private:
priority_queue<int,vector
priority_queue<int,vector
int numa;
int numb;
public:
/** initialize your data structure here. */
MedianFinder() {
numa=0;
numb=0;
};
时间复杂度:查找中位数 O(1)插入元素:O(logn) 空间复杂度:O(n)