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

    xiaoxiao2024-11-16  72

    题目描述:

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用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; } } };

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

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