#include <functional>
#include <queue>
#include <vector>
class Solution {
private:
    priority_queue<int, vector<int>, greater<int>> minHeap;
    priority_queue<int, vector<int>, less<int>> maxHeap;
public:
    void Insert(int num) {
        if (maxHeap.size() == minHeap.size()) {
            minHeap.push(num);
            int x = minHeap.top();
            minHeap.pop();

            maxHeap.push(x);
        }
        if (maxHeap.size() > minHeap.size()) {
            maxHeap.push(num);
            int x = maxHeap.top();
            maxHeap.pop();
            
            minHeap.push(x);
        }
    }

    double GetMedian() { 
        double ans0 = 0.0, ans1 = 0.0;
        if (maxHeap.size() == minHeap.size()) {
            ans0 = maxHeap.top();
            ans1 = minHeap.top();
        }
        else {
            ans0 = maxHeap.top();
        }

        return ans1 == 0 ? ans0 : (ans0 + ans1) / 2.0;
    }

};

使用大根堆记录数据中较小的一半数据,使用小根堆记录数据中较大的一半数据,始终保持二者内部元素数量差 <= 1

  • 若二者元素相同,则返回两个堆堆顶元素的均值
  • 若大根堆数量比小根堆多1,则返回大根堆堆顶元素值

Day4