剑指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相关工具函数都复习了~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值