• Leetcode面试题17.20_连续中值


    题目地址
    实现一个数列的动态添加和查询中位数。

    • 复杂点的话应该可以写个平衡树什么的,然后查询第k大,还可以删除数字。
    • 简单点的话显然可以维护两个堆,一个大顶堆一个小顶堆,而且大顶堆最多比小顶堆多一个,这样查询就直接取大顶堆top元素或者两个堆top元素平均值。
    • 添加的话,如果小于大顶堆top,就加入大顶堆,否则加入小顶堆,然后再根据size大小关系调整一下,因为最多只要调整一次,所以复杂度nlogn是对的。

    code

    class MedianFinder {
    public:
        /** initialize your data structure here. */
        priority_queue<int> le;
        priority_queue<int,vector<int>,greater<int>> ri;
        int siz;
        MedianFinder() {
            le.push(INT_MIN);
            ri.push(INT_MAX);
            siz=0;
        }
        
        void addNum(int num) {
            int lmx=le.top();
            if(num<lmx){
                le.push(num);
            }else{
                ri.push(num);
            }
            if(le.size()>ri.size()+1){
                ri.push(le.top());
                le.pop();
            }else if(le.size()<ri.size()){
                le.push(ri.top());
                ri.pop();
            }
            siz++;
        }
        
        double findMedian() {
            if(siz%2){
                return le.top()*1.0;
            }else{
                return (le.top()+ri.top())*0.5;
            }
        }
    };
    
    /**
     * Your MedianFinder object will be instantiated and called as such:
     * MedianFinder* obj = new MedianFinder();
     * obj->addNum(num);
     * double param_2 = obj->findMedian();
     */
    
  • 相关阅读:
    Officer Anany Collecting String Subsequences(ECPC2019)
    P3530 [POI2012]FESFestival
    L3011 直捣黄龙 (天梯赛)
    树与图上的计数专题
    P4657 [CEOI2017]Chase
    Steadily Growing Steam
    图论复习
    Tree Infection(CF)
    推导部分和(蓝桥杯)
    Baby Ehab's Whining Chance
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12357829.html
Copyright © 2020-2023  润新知