题目描述
现有一些随机生成的数字要将其依次传入,请设计一个高效算法,对于每次传入一个数字后,算出当前所有传入数字的中位数。(若传入了偶数个数字则令中位数为第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
priority_queue<int,vector<int>,greater<int>> minheap;//小顶堆
priority_queue<int,vector<int>,less<int>>maxheap;//大顶堆
vector<int> res(n,0);
for(int i=0;i<n;i++)
{
if(maxheap.empty())
maxheap.push(A[i]);
else if(A[i]<maxheap.top())
{
maxheap.push(A[i]);
if(maxheap.size()-minheap.size()>1)
{
minheap.push(maxheap.top());
maxheap.pop();
}
}
else{
minheap.push(A[i]);
if(minheap.size()>maxheap.size())
{
maxheap.push(minheap.top());
minheap.pop();
}
}
res[i]=maxheap.top();
}
return res;
}
};