美文网首页
2020-03-12[剑指offer]数据流中的中位数

2020-03-12[剑指offer]数据流中的中位数

作者: Coding破耳 | 来源:发表于2020-03-12 18:30 被阅读0次

题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

偷懒用了map,现成的排序树

#include<map>
using namespace std;
class Solution {
public:
    map<int,int> maxMap;
    map<int,int> minMap;

    void Insert(int num)
    {
        if((maxMap.size() == 0 && 
                    (minMap.size() == 0 || (minMap.size() && num > minMap.rbegin()->first)))
          ||(maxMap.size() && num > maxMap.begin()->first))
        {
            maxMap.insert(make_pair(num,1));
            if(maxMap.size() > minMap.size())
            {
                minMap.insert(make_pair(maxMap.begin()->first,1));
                maxMap.erase(maxMap.begin()->first);
            }
        }
        else
        {
            minMap.insert(make_pair(num,1));
            if(minMap.size() > maxMap.size())
            {
                maxMap.insert(make_pair(minMap.rbegin()->first,1));
                minMap.erase(minMap.rbegin()->first);
            }
        }
    }

    double GetMedian()
    { 
        int mincount = minMap.size();
        int maxcount = maxMap.size();
        if(mincount < maxcount)
        {
            return (double)maxMap.begin()->first;
        }
        else if(mincount > maxcount)
        {
            return (double)minMap.rbegin()->first;
        }
        else
        {
            return (double)(minMap.rbegin()->first+maxMap.begin()->first)/2;
        }
    }
};

相关文章

网友评论

      本文标题:2020-03-12[剑指offer]数据流中的中位数

      本文链接:https://www.haomeiwen.com/subject/kosbjhtx.html