剑指offer - 面试题41: 数据流中的中位数 - C++

啥都不说了先上代码 

class Solution {
private: vector<int> min;  // 最小堆(右)
         vector<int> max;  // 最大堆,其中所有元素比最小堆的所有元素小
public:
    void Insert(int num)
    {
        if(((max.size() + min.size()) & 1) == 0) {  //  偶数,插入最小堆min
            if(max.size() && num<max[0]) {  // 比最大堆的堆顶小,先插入最大堆,把最大堆最大的元素替出来
                max.push_back(num);
                push_heap(max.begin(), max.end());
                
                num = max[0];
                pop_heap(max.begin(), max.end());
                max.pop_back();
            }
            min.push_back(num);
            push_heap(min.begin(), min.end(), greater<int>());
        } else {  // 奇数,插入最大堆;
            if(min.size() && 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());
        }
    }

    double GetMedian()
    { 
        int size = max.size() + min.size();
        if(size == 0) throw "No numbers";
        double median;
        if(size & 1 == 1) {
            median = min[0];
        }
        else {
            median = (min[0] + max[0]) / 2.0;
        }
        return median;
    }
};

第三次过:

第一次:段错误,数组越界或递归层数太多。  检查了一边代码逻辑没问题,发现 if(((max.size() + min.size()) & 1) == 0)这句因为&优先级比==低,所以出现逻辑错误。

第二次:测试用例不过,人家是3.5的我是3.0。除号/问题。这个挺有意思的,/两边都是int按取整算,/两边有一个是double,结果就是double。(参考  https://blog.csdn.net/lujiandong1/article/details/44225581)至于被赋值的数是double,转不转换我也不清楚。把2改成2.0之后,在几秒焦急地等待后听到了通过的声音!

真好,顺便把今天上午看的heap相关工具函数都复习了~

猜你喜欢

转载自blog.csdn.net/L_bic/article/details/88557681