//描述
//如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
// 数据范围:数据流中数个数满足1-1000,大小满足1-1000
// 进阶: 空间复杂度O(n), 时间复杂度O(nlogn)
//插入法
vector<int> buff;
void Insert(int num)
{
if (buff.empty())
{
buff.push_back(num);
}
else
{
auto it = lower_bound(buff.begin(), buff.end(), num);
buff.insert(it, num);
}
}
double GetMedian()
{
double result = 0.0;
int length = buff.size();
if ((length & 1) == 0)
{
result = (double)(buff[length / 2] + buff[length / 2 - 1]) / 2;
}
else
{
result = ((double)buff[length / 2]);
}
return result;
}
//双重优先队列法
priority_queue<int> lpq;
priority_queue<int, vector<int>, greater<int>> rpq;
void Insert(int num)
{
lpq.emplace(num);
rpq.emplace(lpq.top());
lpq.pop();
if (lpq.size() < rpq.size())
{
lpq.emplace(rpq.top());
rpq.pop();
}
}
double GetMedian()
{
double result = 0.0;
int lsz = lpq.size();
int rsz = rpq.size();
if (lsz != rsz)
{
result = lpq.top();
}
else
{
result = (double)(lpq.top() + rpq.top()) / 2.0;
}
return result;
}