剑指offer-刷题笔记-中难题-JZ41 数据流中的中位数

剑指offer-刷题笔记-中难题-JZ41 数据流中的中位数

版本1

使用外部交换排序方法排序不断排序数组

class Solution {
public:
     //交换
    void swap(int &a,int &b)
    {
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
    
    //交换排序-从小到大排序
    void swapSort(vector<int> &input)
    {
        for(int i = 0;i < input.size(); i++)
        {
            for(int j = i+1;j < input.size(); j++)
            {
                if(input[j] < input[i])
                {
                     swap(input[i],input[j]);
                }
            }
        }
    }
    vector<int>input;
    void Insert(int num) {
       input.push_back(num);
       swapSort(input);
    }
    double GetMedian() { 
       
       double res;
       if(input.size() % 2 == 1)
       {
           res =  input[input.size() / 2] * 1.0;
       }else if (input.size() % 2 == 0)
       {
           res = (input[input.size() / 2] + input[(input.size() / 2)-1]) * 0.5;   
       }
        return res;
    }

};

版本2

利用数据读入的时候排序

class Solution {
public:
  
    vector<int>input;
    void Insert(int num) {
        if(input.empty())
        {
            //input中没有数据,直接加入
            input.push_back(num);
        }else{
            //遍历排序,并插入
            int i = 0;
            for(;i < input.size();i++)
            {
                if(num < input[i])
                {
                    break;
                }
            }
            input.insert(input.begin()+i, num);
        }
    }
    double GetMedian() { 
       
       double res;
       int n = input.size();
       if( n % 2 == 1)
       {
           res =  input[n / 2] * 1.0;
       }else if (n % 2 == 0)
       {
           res = (input[n / 2] + input[(n / 2)-1]) * 0.5;   
       }
        return res;
    }

};

版本3

利用大顶堆和小顶堆的特性

class Solution {
public:
  
    //优先队列即PriorityQueue,是一种内置的机遇堆排序的容器,分为大顶堆与小顶堆,大顶堆的堆顶为最大元素,
    //其余更小的元素在堆下方,小顶堆与其刚好相反。且因为容器内部的次序基于堆排序,因此每次插入元素时间复杂
    //度都是O(log2n)O(log_2n)O(log 
    //n),而每次取出堆顶元素都是直接取出。

 //维护两个堆,取两个堆顶部即可
    void Insert(int num)
    {
        //先加入较小部分
        min.push(num);
        //将较小部分的最大值取出,送入到较大部分
        max.push(min.top());
        min.pop();
        //平衡两个堆的数量
        if(min.size() < max.size())
        {
            min.push(max.top());
            max.pop();
        }
        
    }
    
    double GetMedian() { 
        //奇数个
        if(min.size() > max.size())
            return (double)min.top();
        //偶数个
        else
            return (double)(min.top() + max.top()) / 2;
    }
private:
    //大顶堆,元素值较小
    priority_queue<int>min;
    //小顶堆,元素值都比大顶堆大
    priority_queue<int,vector<int>,greater<int>> max;
   
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值