美文网首页
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