《剑指offer》面试题64 数据流中的中位数

来源:互联网 发布:沙钢集团网络培训 编辑:程序博客网 时间:2024/04/24 18:48

关于仿函数的文章

http://blog.csdn.net/sicofield/article/details/9050833

http://blog.csdn.net/chyuanzheng/article/details/7837165


二元仿函数(来自第一个链接)

等于:equal_to<T>

不等于:not_equal_to<T>

大于:greater<T>

大于等于:greater_equal<T>

小于:less<T>

小于等于:less_equal<T>

------------------------------------------------------------------------

/*
参考书上思路,P289
用大小堆来实现

###max,min###
        1 2,3 5 4
左右个数差1或者相等 (#所代表的数字无序)

!! pay attention to
判断奇偶数的时候一定要括号,用&的话
(size&1)==1


*/

class Solution {        vector<int>min,max;    public:    void Insert(int num)    {        if(((min.size()+max.size())&1)==0)//偶数个,加入最小堆           {               if(max.size()>0&&num<max[0])                {                   max.push_back(num);                   push_heap(max.begin(),max.end(),less<int>());//调整最大堆                   /*新添加一个元素在末尾,然后重新调整堆序。也就是把元素添加在底层vector的end()处*/                                      num=max[0];                   pop_heap(max.begin(),max.end(),less<int>());//删除最大堆的最大值                   /*把堆顶元素取出来,放到了数组或者是vector的末尾,用原来末尾元素去替代*/                                      max.pop_back();               }               min.push_back(num);               push_heap(min.begin(),min.end(),greater<int>());                          }           else            {               if(min.size()>0 && num>min[0])                   {                   min.push_back(num);                   push_heap(min.begin(),min.end(),greater<int>());                   num=min[0];                   pop_heap(min.begin(),min.end(),greater<int>());                   min.pop_back();                                  }               max.push_back(num);               push_heap(max.begin(),max.end(),less<int>());           }            }    double GetMedian()    {             int size=min.size()+max.size();        if(size==0)return 0;        double m=0;                if((size&1)==1)//奇数            m=min[0];        else m=(min[0]+max[0])/2.0;  //m是小数,所以是/2.0 不是/2        return m;    }};



0 0
原创粉丝点击