C++优先队列(大小堆)

数据流中的中位数

http://www.nowcoder.com/questionTerminal/9be0172896bd43948f8a32fb954e1be1

大致思路如下:
把数据流分成前后两个部分,前一部分的所有值都比后一部分的所有值小;
前一部分用一个最大堆存储,后一部分用一个最小堆存储;
之所以这样是为了方便判断新输入的数应该进入前半部分还是后半部分,如果大于最大堆的堆顶,说明大于前半部分的所有数,因此可以进入后半部分,对后半部分的操作同理;
当输入的数的个数为奇数时,最小堆比最大堆多一个数,直接输出最小堆堆顶的数即可;
当为偶数时,输出两个堆顶数的平均数。

class Solution {
private:
    int cnt = 0;
    priority_queue<int> max_heap;
    priority_queue<int, vector<int>, greater<int>> min_heap;
public:
    void Insert(int num) {
        if((cnt & 1) == 0) {
            max_heap.push(num);
            int tmp=max_heap.top();
            max_heap.pop();
            min_heap.push(tmp);
        } else {
            min_heap.push(num);
            int tmp = min_heap.top();
            min_heap.pop();
            max_heap.push(tmp);
        }
        ++cnt;
    }

    double GetMedian() { 
        if((cnt & 1) == 0) return (double)(min_heap.top() + max_heap.top()) / 2.0;
        else return (double)min_heap.top();
    }

};
全部评论

相关推荐

10-24 00:54
已编辑
门头沟学院 Java
牛客20646354...:这连小厂都找不到就离谱,只能说可能你根本没投什么小厂。说实话现在都要11月了,没什么岗位了。其实最好是在9月找,那时候暑假工刚走,岗位多的是,现在都占满了岗位了,秋招的秋招,顶替暑假工的也基本上都顶替了。 只能多投了,简历其实都差不多,你这都不是外卖+点评去找实习了,已经比好多人优秀了。实在找不到,可以降低一些标准的,能投到自研项目的小厂说实话可能比你去中大厂能学到更多东西。因为中大厂最多给你看一点点模块功能,小厂基本上全部代码甚至几个项目的代码都能拿到。
点赞 评论 收藏
分享
Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务