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

Posted by BY Tony Huang on May 26, 2019

题目描述:

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

算法思路:

这道题的算法比较简单,每次输入一个数据,之后对这个vector进行排序找中位数就好了,注意看代码和写的注意要点。

代码:

class Solution {
public:
    //这里数据流的意思是一个数组,每输入一个数,判断这个数组的中位数,
    //是一个不断动态的过程,例如说[5,7,1,1,6],首先就输入5,现在数组是[5],中位数是5
    //接下来输入7,现在数组是[5,7](排序之后),中位数是3.5,接下来输入8,现在数组是[1,5,7](排序之后),中位数是5……
    //最终Ob系统判定的是整个过程的中位数。
          vector<int>data;
          int n=0;
    void Insert(int num)
    {
         data.push_back(num);
         n=n+1;
    }
    double GetMedian()
    {
       int q=2,y=67;
        int temp;
        //Sort函数的用
//(1)	如果是数组arr[10],sort(arr,arr+10);默认升序
//(2)	如果是Vector<int>data,sort(data.begin(),data.end()),默认升序

       sort(data.begin(),data.end());
        if(n%2==0)
        {
             double result;
            temp=n/2;
            result=(data[temp]+data[temp-1])/2.0;//这里result是double类型的数值,因此这个要除2.0而不是2
           return result;
        }
        else 
        {
            double result;
             temp=n/2;
            result=data[temp];
            return result;
        }
   
    }

};

这道题本身不难,注意以下几点:

  1. 这里数据流的意思是一个数组,每输入一个数,判断这个数组的中位数,是一个不断动态的过程,例如说[5,7,1,1,6],首先就输入5,现在数组是[5],中位数是5,接下来输入7,现在数组是[5,7](排序之后),中位数是3.5,接下来输入8,现在数组是[1,5,7](排序之后),中位数是5……最终Ob系统判定的是整个过程的中位数。
  2. Sort函数的用法 (1) 如果是数组arr[10],sort(arr,arr+10);默认升序 (2) 如果是Vectordata,sort(data.begin(),data.end()),默认升序
  3. result=(data[temp]+data[temp-1])/2.0;//这里result是double类型的数值,因此这个要除2.0而不是2