multiset c++实现

数据流中的中位数

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

法一:用Multiset做的,因为它有个自动排序功能

class Solution {
public:
    void Insert(int num)
    {
        stream.insert(num);
    }

    double GetMedian()
    {
        double res = 0.0;
        unsigned int size = stream.size();

        multiset<int>::iterator it = stream.begin();
        unsigned int cnt = size / 2;
        while(cnt){
            --cnt;
            ++it;
        }
        if(size % 2 == 0)
            res = (double)(*it + *(--it)) / 2;
        else
            res = *it;
        return res;
    }
private:
    multiset<int> stream;
};

法二:用最大堆最小堆做

class Solution {
private:
    int size = 0;
    priority_queue<int, vector<int>, less<int>> max;
    priority_queue<int, vector<int>, greater<int>> min;

public: //用一个最大堆和一个最小堆做
    void Insert(int num)
    {
        ++size;
        //偶数时,放入最小堆,奇数时,放入最大堆
        //如果num为偶数,且比最小堆的top还大,则先入最小堆,再把堆顶入最大堆;num奇数同理
        if(size & 1){
            if(!min.empty() && num > min.top()){
                min.push(num);
                num = min.top();
                min.pop();
            }
            max.push(num);
        }
        else{
            if(!max.empty() && num < max.top()){
                max.push(num);
                num = max.top();
                max.pop();
            }
            min.push(num);
        }
    }

    double GetMedian()
    {
        double res = 0.0;
        if(size == 0) return res;

        if(size & 1){
            res = max.top();
        }
        else{
            res = (max.top() + min.top()) / 2.0;
        }
        return res;
    }
};
全部评论

相关推荐

醒工硬件:1学校那里把xxxxx学院去了,加了学院看着就不像本校 2简历实习和项目稍微精简一下。字太多,面试官看着累 3第一个实习格式和第二个实习不一样。建议换行 4项目描述太详细了,你快把原理图贴上来了。比如可以这样描述:使用yyyy芯片,使用xx拓扑,使用pwm控制频率与占空比,进行了了mos/电感/变压器选型,实现了xx功能 建议把技术栈和你做的较为有亮点的工作归纳出来 5熟悉正反激这个是真的吗
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务