剑指offer之数据流中的中位数

版权声明:所有的博客都是个人笔记,交流可以留言。未经允许,谢绝转载。。。 https://blog.csdn.net/qq_35976351/article/details/88620841

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数

解题思路

肯定不能用排序,那样肯定会超时。更为稳妥的办法是使用std::multiset结构,插入数据复杂度是 log 2 N \log_2{N} ,同时支持前后迭代。注意迭代器没有it = it + 1这种操作…

AC代码

class Solution {
public:
    void Insert(int num)
    {
        numbers.insert(num);
        int len = numbers.size();
        if (len == 1) {
            x = y = numbers.begin();
        } else if (len % 2 ==1) {  // 奇数个
            if (num >= *x && num <= *y) {  // 插在中间
                ++x;
                y = x;
            } else if (num < *x) {
                y = x;  // 比x小
            } else {
                x = y;  // 比y大
            }
        } else {  // 偶数个
            if (num >= *x ) {
                ++y;
            } else {
                --x;
            }
        }
    }

    double GetMedian()
    { 
        return double (*x + *y) / 2; 
    }
    
    multiset<int> numbers;
    multiset<int>::iterator x, y;
};

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/88620841