295. 数据流的中位数

295. 数据流的中位数


题目链接:295. 数据流的中位数

代码如下:

//普通数组方法:超时
// class MedianFinder {
// public:
//     vector arr;
//     MedianFinder() {
//     }
    
//     void addNum(int num) {
//         arr.push_back(num);
//         sort(arr.begin(),arr.end());
//     }
    
//     double findMedian() {
//         if(arr.size()%2==0)
//             return 1.0*(arr[arr.size()/2]+arr[arr.size()/2-1])/2;
//         else
//             return 1.0*arr[arr.size()/2];
//     }
// };

//参考:https://leetcode.cn/problems/find-median-from-data-stream/solutions/2361972/295-shu-ju-liu-de-zhong-wei-shu-dui-qing-gmdo
//大小根堆
class MedianFinder {
public:

    //小根堆,最小的元素在堆顶,该堆保存的是元素的较大的一半数
    priority_queue<int,vector<int>,greater<int>> minHeap;
    //大根堆,最大的元素在堆顶,该堆保存的是元素的较小的一半数
    priority_queue<int,vector<int>,less<int>> maxHeap;
    
    MedianFinder() {
    }
    
    void addNum(int num) {
        if(minHeap.size()!=maxHeap.size())//即小根堆比大根堆元素多一
        {
            minHeap.push(num);
            maxHeap.push(minHeap.top());
            minHeap.pop();
        }
        else
        {
            maxHeap.push(num);
            minHeap.push(maxHeap.top());
            maxHeap.pop();
        }
    }
    
    double findMedian() {
        if(minHeap.size()==maxHeap.size())
            return (minHeap.top()+maxHeap.top())/2.0;
        return minHeap.top();
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

你可能感兴趣的:(leetcode,c++)