题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
解题思路:使用set 存放数据流中的数据,set会自行排序,我只需要在拿中位数的时候做判断,如果set.size()=是偶数 用中间两个数的平均值(先将其保存到double类型中 再求平均值),如果set.size()是奇数 返回中间那个数。 查找中位数的时间复杂度高一些。
class Solution {
public:
void Insert(int num)
{
n.insert(num);
}
double GetMedian()
{
int len=n.size();
if(len%2==0)//偶数个个数
{
int mid=len/2;
set<int> ::iterator it=n.begin();
for(int i =1;i<mid;++i)
{
++it;
}
double n1=*it;
it++;
double n2=*it;
return (n1+n2)/2;
}
else{
int mid=len/2;
set<int> ::iterator it=n.begin();
for(int i =0;i<mid;++i)
{
++it;
}
return *it;
}
}
set<int> n;
};