数据流中的中位数

class Solution {
public:
void Insert(int num)
{
int n = min.size(); //最小堆的元素
int m = max.size(); //最大堆的元素

    if (((n + m) &1) == 0)  //若为偶数,即n == m //则将元素插入最大堆
    {
        if (n > 0 && num > min[0]) //原本是要插入到最大堆的,可是这个数比最小堆堆堆顶大,则需要调换
        {
            int temp = min[0];  //最小堆堆顶元素
            pop_heap(min.begin(), min.end()); // pop最小堆最顶元素
            min.pop_back();

            min.push_back(num);  //push num到最小堆
            make_heap(min.begin(), min.end(), greater<int>());

            max.push_back(temp);
            make_heap(max.begin(), max.end());
        }
        else {
            max.push_back(num);
            make_heap(max.begin(), max.end());
        }
    }
    else {  //若为奇数,插入元素到最小堆。此时一定有 m > 0
        if (num < max[0])  //若有num小于最大堆堆顶,则需要把最大堆堆顶 放入最小堆
        {
            int temp = max[0];

            pop_heap(max.begin(), max.end()); //将最大堆堆顶换至到末尾
            max.pop_back();

            max.push_back(num);
            make_heap(max.begin(), max.end());

            min.push_back(temp);
            make_heap(min.begin(), min.end(), greater<int>());
    }
        else { //直接插入最小堆堆顶
            min.push_back(num);
            make_heap(min.begin(), min.end(), greater<int>());
        }
}

}

double GetMedian()
{
    double res;
    int m = max.size(); //最大堆堆顶元素
    int n = min.size();

    if (m == n && m == 0)
        return 0.0;

    if (n == m)
        res = (double)((max[0] + min[0]) / 2.0);
    if (n != m)
        res = (double)max[0];

    return res;
}

private:
vector<int> min;
vector<int> max;
};</int></int>

全部评论

相关推荐

会飞的猿:本人来了,手一抖转错了,我是学生,能还给我吗
点赞 评论 收藏
分享
01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务