原题链接
题目描述
思路
代码
C++
class MedianFinder {
priority_queue<int, vector<int>, greater<int>> up;
priority_queue<int> down;
public:
MedianFinder() {
}
void addNum(int num) {
if ( down.empty() || num <= down.top() )
{
down.push(num);
if ( down.size() > up.size() + 1 )
{
up.push(down.top());
down.pop();
}
}
else
{
up.push(num);
if ( up.size() > down.size() )
{
down.push(up.top());
up.pop();
}
}
}
double findMedian() {
if ( down.size() + up.size() & 1 ) return down.top();
return (down.top() + up.top()) / 2.0;
}
};
Java
class MedianFinder {
private PriorityQueue<Integer> up;
private PriorityQueue<Integer> down;
public MedianFinder() {
up = new PriorityQueue<>();
down = new PriorityQueue<>((a, b) -> b - a);
}
public void addNum(int num) {
if ( down.isEmpty() || num <= down.peek() )
{
down.offer(num);
if ( down.size() > up.size() + 1 )
up.offer(down.poll());
}
else
{
up.offer(num);
if ( up.size() > down.size() )
down.offer(up.poll());
}
}
public double findMedian() {
if ( (up.size() + down.size()) % 2 == 1 ) return down.peek();
return (up.peek() + down.peek()) / 2.0;
}
}