《劍指offer》面試題64 數據流中的中位數

關於仿函數的文章

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;
    }

};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章