数据流中的中位数

  • 维护一个大顶堆和一个小顶堆(动态平衡二叉树的插入效率高,不会出现退化现象)

  • count表示这是第几个数,如果是偶数个放入右边的小顶堆,如果是奇数,放入左边的大顶堆。在放入之后要保证左边的大顶堆最大的数小于右边的小顶堆最小的数

 TreeSet<Integer> min = new TreeSet<Integer>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            // TODO Auto-generated method stub
            return o1 -o2;
        }
    });

    TreeSet<Integer> max = new TreeSet<Integer>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            // TODO Auto-generated method stub
            return o2 -o1;
        }
    });
    int count = 0;
    public void Insert(Integer num) {
        count++;
        if(count%2==0)
        {
            min.add(num);
            if(max.size()!=0)
            {
                int maxTop = max.first();
                int minTop = min.first();
                if(maxTop>minTop)
                {
                    max.remove(maxTop);
                    min.remove(minTop);
                    max.add(minTop);
                    min.add(maxTop);
                }
            }
        }
        else{
            max.add(num);
            if(min.size()!=0)
            {
                int maxTop = max.first();
                int minTop = min.first();
                if(maxTop>minTop)
                {
                    max.remove(maxTop);
                    min.remove(minTop);
                    max.add(minTop);
                    min.add(maxTop);
                }
            }

        }
    }

    public Double GetMedian() {
        if(count%2==1)
        {
            return (double)max.first();
        }
        else{
            return (double) ((max.first() + min.first()) / 2.0);
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 源自《剑指offer》第63题 问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就...
    胖三斤66阅读 2,977评论 0 2
  • 本文首发于我的个人博客:尾尾部落 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数...
    繁著阅读 593评论 0 1
  • [牛客]数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有...
    祁晏晏阅读 164评论 0 1
  • 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值...
    CyanStone阅读 2,123评论 0 1
  • Flask是一个轻量级的WSGI Web应用程序框架。它旨在使入门快速简便,并能够扩展到复杂的应用程序。它最初是围...
    PeppaTang阅读 402评论 0 0