“`java
class MedianFinder {
//采用大顶堆和小顶堆,A为大,B为小,偶数时,两个堆存放元素数相同,奇数时A存放多一个,则中位数为A堆顶和B堆顶之和除以2,或者是A的堆顶
Queue A,B;
/** initialize your data structure here. */
public MedianFinder() {
//存放较小的一半
A = new PriorityQueue<>((x, y) -> (y – x));
//小顶堆存放较大的一半
B = new PriorityQueue<>();
}
public void addNum(int num) {
if (A.size() == B.size()) {
B.offer(num);
A.offer(B.poll());
} else {
A.offer(num);
B.offer(A.poll());
}
}
public double findMedian() {
if (A.size() == B.size()) {
return (A.peek() + B.peek())/2.0;
}
return A.peek();
}
class MedianFinder {
Queue min,max;
/** initialize your data structure here. */
public MedianFinder() {
min = new PriorityQueue<>();
max = new PriorityQueue<>((x,y)->(y-x));
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
使用堆来动态维护
共以下 15 个回答
“`java A,B;
class MedianFinder {
//采用大顶堆和小顶堆,A为大,B为小,偶数时,两个堆存放元素数相同,奇数时A存放多一个,则中位数为A堆顶和B堆顶之和除以2,或者是A的堆顶
Queue
/** initialize your data structure here. */
public MedianFinder() {
//存放较小的一半
A = new PriorityQueue<>((x, y) -> (y – x));
//小顶堆存放较大的一半
B = new PriorityQueue<>();
}
}
class MedianFinder { min,max;
Queue
/** initialize your data structure here. */
public MedianFinder() {
min = new PriorityQueue<>();
max = new PriorityQueue<>((x,y)->(y-x));
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
使用堆来动态维护
优先队列
【思路】利用大小堆数据结构(具体是C++STL priority queue)分别保存一半的数据,大堆保存小数,小堆保存大数
【复杂度】时间复杂度O(nlogn),空间复杂度O(n),查找时间复杂度为O(1)
“`C++
class MedianFinder {
public:
void addNum(int num) {
// 先将数字插入最大堆,再将最大堆顶部元素移动到最小堆
maxHeap.push(num);
minHeap.push(maxHeap.top());
maxHeap.pop();
private:, std::less > maxHeap; // 最大堆存放左半部分元素 , std::greater > minHeap; // 最小堆存放右半部分元素
std::priority_queue<int, std::vector
std::priority_queue<int, std::vector
};
“`
思想:利用两个堆,一个大根堆,一个小根堆,保持其数量基本一致
时间复杂度O(logn) 空间复杂度O(n)
利用堆排,小存大,大存小,所以堆顶是中位数
maintain两个堆
官解 优先队列
参考大神的代码
时间复杂度:查找 O(1) ,添加数字O(logN) 空间复杂度:O(N)
时间复杂度:1.查找中位数O(1), 2,插入元素:O(logn)
空间复杂度:O(n)
MY优先队列