题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
法一:我一开始拿到题时候的想法:用一个内部元素从小到大排列的优先队列存元素,弹出元素直到可以取到中间的元素(容器内奇数个元素)或者中间两个元素(容器内偶数个元素)。但是题目要求实现一个函数,得 考虑函数调用后得把容器内该有的碳元素恢复,所以用一个辅助栈保存队列弹出的,找到需要元素后再把元素压入队列。这样,插入的时间复杂度是O(1),取中位数是O(n)
class Solution {
public:
priority_queue<int, vector<int>, greater<int> > q;
stack<int> STACK;
void Insert(int num)
{
q.push(num);
}
double GetMedian()
{
int count=q.size();
if(count==0)
return 0;
int tmpCount=count;
if(count%2==1)
{
while(tmpCount!=(count/2+1))
{
STACK.push(q.top());
q.pop();
tmpCount--;
}
int result=q.top();
while(STACK.size())
{
q.push(STACK.top());
STACK.pop();
}
return result;
}
else
{
while(tmpCount!=(count/2+1))
{
STACK.push(q.top());
q.pop();
tmpCount--;
}
double mid1=q.top();
STACK.push(mid1);
q.pop();
double mid2=q.top();
while(STACK.size())
{
q.push(STACK.top());
STACK.pop();
}
return (mid1+mid2)/2;
}
}
};