题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用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) 如果是Vector
data,sort(data.begin(),data.end()),默认升序 - result=(data[temp]+data[temp-1])/2.0;//这里result是double类型的数值,因此这个要除2.0而不是2