剑指offer面试题41--数据流中的中位数

题目描述:

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用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;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/81219279