• 81 · 寻找数据流的中位数


    描述

    本题将给出一个整数数据流,你将实现如下两个函数:

    • 函数 add(val) :从数据流中获得一个数字。
    • 函数 getMedian() :返回你从数据流获得的所有数字的 中位数

    本题的 中位数 不等同于数学定义里的 中位数 。
    本题的中位数是指将所有数字排序后得到数组的中间值,如果有数组 A 中有 n 个数,则中位数为 A[(n - 1) / 2] 。
    比如:数组 A=[1,2,3] 的中位数是 A[(3-1)/2] = A[1] = 2,数组 A=[1,19] 的中位数是 A[(2-1)/2] = A[0] = 1 。

    4轮面试3轮遇原题!
    《Amazon高频题礼包》刷完上岸率翻倍!
    微信添加【jiuzhang0607】备注【Amazon】领取

    数据流中的数字数量不会超过 10^4104 个。

    样例

    样例 1:

    输入:

     
    
    1. add(1)
    2. getMedian()
    3. add(2)
    4. getMedian()
    5. add(3)
    6. getMedian()
    7. add(4)
    8. getMedian()
    9. add(5)
    10. getMedian()

    输出:

     
    
    1. 1
    2. 1
    3. 2
    4. 2
    5. 3

    解释:

    [1] 和 [1,2] 的中位数是 1,
    [1,2,3] 和 [1,2,3,4] 的中位数是 2,
    [1,2,3,4,5] 的中位数是 3。
    样例 2:

    输入:

     
    
    1. add(4)
    2. getMedian()
    3. add(5)
    4. getMedian()
    5. add(1)
    6. getMedian()
    7. add(3)
    8. getMedian()
    9. add(2)
    10. getMedian()
    11. add(6)
    12. getMedian()
    13. add(0)
    14. getMedian()

    输出:

     
    
    1. 4
    2. 4
    3. 4
    4. 3
    5. 3
    6. 3
    7. 3

    解释:

    [4], [4,5] 和 [4,5,1] 的中位数是 4,
    [4,5,1,3], [4,5,1,3,2], [4,5,1,3,2,6] 和 [4,5,1,3,2,6,0] 的中位数是 3。

    挑战

    实现一个时间复杂度为 O(n*logn)O(n∗logn) 的算法

     

    vector ret;


    int findLeftMax(vector&ret, int val)
    {
        //二分查找
        int left = 0;
        int right = ret.size() - 1;
        int mid = (left + right) / 2;

        while (left     {
            if (val > ret[left])
            {
                if (left + 1 <= right )
                {
                    if (ret[left + 1] < val && val > ret[mid])
                    {
                        left = mid + 1;
                    }
                    else
                    {
                        left = left + 1;
                    }
                }
            }
            else if (val < ret[left])
            {
                right = mid;
            }
            else if (val == ret[left])
            {
                return left;
            }

            if (left >= right)
            {
                if (val > ret[right])
                {
                    return left + 1;
                }
                return left;
            }
             mid = (left + right) / 2;
        }

        return left;

    }

    void add(int val) {
        // write your code here
        if (ret.size() == 0)
        {
            ret.push_back(val);
            return;
        }
        if (ret.size() == 1)
        {
            if (ret[0] > val)
            {
                int tmp = ret[0];
                ret.pop_back();
                ret.push_back(val);
                ret.push_back(tmp);
                return;
            }
            else
            {
                ret.push_back(val);
                return;
            }
        }

        //开头
        if (val < ret[0])
        {
            ret.insert(ret.begin(), val);
            return;
        }
        //结尾
        if (val > ret[ret.size()-1])
        {
            ret.push_back(val);
            return;
        }
        int index = findLeftMax(ret, val);
        ret.insert(ret.begin() + index, val);
    }

    int getMedian() {
        // write your code here

        return ret[(ret.size() - 1) / 2];

        return 0;
    }
     

  • 相关阅读:
    弹性蛋白酶中英文说明书
    Hyperledger Fabric部署与测试(Ubuntu)
    “菜鸟”程序员逆袭:独立开发iOS音乐应用,年底参加Amazon DeepRacer 全球锦标赛
    前端发布项目后,解决缓存的老版本文件问题
    数据库顶会 VLDB 2023 论文解读:字节跳动如何解决超大规模流式任务运维难题
    【SpringBoot篇】基于SpringBoot进行Web开发
    treevalue——Master Nested Data Like Tensor
    vue 封装 瀑布流
    makefile 使用学习,小白入门~
    可能是入门高阶数学的好通道 —— 很直观易记,又很难判断的真假的数学命题们
  • 原文地址:https://blog.csdn.net/yinhua405/article/details/127438525