题目描述
现有一些随机生成的数字要将其依次传入,请设计一个高效算法,对于每次传入一个数字后,算出当前所有传入数字的中位数。(若传入了偶数个数字则令中位数为第n/2小的数字,n为已传入数字个数)。
给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000。
测试样例:
[1,2,3,4,5,6],6
返回:[1,1,2,2,3,3]
堆的应用
class Middle
{
public:
vector<int> getMiddle(vector<int> A, int n)
{
// write code here
//大顶堆的个数和小顶堆的个数相等,或者只比它多一
//刚开始错在这里。。忘记设置为小顶堆了
//less<>为大顶,greater<>为小顶,默认为less<>
priority_queue<int, vector<int>, greater<int>> minheap;
priority_queue<int> maxheap;
vector<int> ans(n);
for (int i = 0; i < n; ++i)
{
int temp = A[i];
if (minheap.size() < maxheap.size())
{
if (temp < maxheap.top())
{
maxheap.push(temp);
temp = maxheap.top();
maxheap.pop();
minheap.push(temp);
}
else
{
minheap.push(temp);
}
}
else // if(minheap.size() >= maxheap.size())
{
//空的情况
if (minheap.size() == 0)
{
maxheap.push(temp);
}
else if (temp > minheap.top())
{
minheap.push(temp);
temp = minheap.top();
minheap.pop();
maxheap.push(temp);
}
else
{
maxheap.push(temp);
}
}
//answer
ans[i] = maxheap.top();
}
return ans;
}
};