zoukankan      html  css  js  c++  java
  • 剑指offer 数据流中的中位数

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

    思路分析:
    本质上都是要在插入数字后,进行排序,之后再进行判断总个数是偶数还是奇数,算出中位数。

    一.快速排序(效率不咋行,这题数据弱居然过了,23333)

    class Solution {
    public:
        vector<int> v;
        int n;
        void Insert(int num)
        {
            v.push_back(num);
            n=v.size();
            sort(v.begin(),v.end());//插入后,再排序。
        }
    
        double GetMedian()
        { 
            double result;
            if(n%2==0)
            {
                result=(v[n/2-1]+v[n/2])/2.0;
            }else
            {
                result=v[n/2]/1.0;
            }
            return result;
        }
    
    };
    

    二.大顶堆和小顶堆(用优先队列自动帮你排序,挺香的)

    class Solution {
          priority_queue<int,vector<int>,less<int>> min;
        priority_queue<int,vector<int>,greater<int>> max;
    public:
      
        void Insert(int num)
        {
            if(min.empty()||num<=min.top())
                min.push(num);
            else
                max.push(num);
            if(min.size()==max.size()+2)//偶数
            {
                max.push(min.top());
                min.pop();
            }
            if(min.size()+1==max.size())//奇数
            {
                min.push(max.top());
                max.pop();
            }
        }
    
        double GetMedian()
        { 
            return max.size()==min.size()?(min.top()+max.top())/2.0:min.top();
        }
    
    };
    
  • 相关阅读:
    JavaScript事件冒泡简介及应用
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结
    个人作业——软件测评
    寒假作业(2/2)
    寒假作业(1/2)
    gitlab-ci.yml可用关键字描述
    gitlab-Runner配置参数详解
    gitlab-ci部署实现持续集成(centos7)
    linux时间同步操作命令
  • 原文地址:https://www.cnblogs.com/YenKoc/p/12779958.html
Copyright © 2011-2022 走看看