zoukankan      html  css  js  c++  java
  • LintCode "Sliding Window Median" & "Data Stream Median"

    Besides heap, multiset<int> can also be used:

    class Solution {
        void removeOnly1(multiset<int> &ms, int v)
        {
            auto pr = ms.equal_range(v);
            ms.erase(pr.first);
        }
    
        void remove(multiset<int> &lmax, multiset<int> &rmin, int v)
        {
            if(v <= *lmax.rbegin())
            {
                removeOnly1(lmax, v);
                if(lmax.size() < rmin.size())
                {
                    int tmp = *rmin.begin();
                    lmax.insert(tmp);
                    removeOnly1(rmin, tmp);
                }
            }
            else if(v >= *rmin.begin())
            {
                removeOnly1(rmin, v);
                if((lmax.size() - rmin.size()) > 1)
                {
                    int tmp = *lmax.rbegin();
                    removeOnly1(lmax, tmp);
                    rmin.insert(tmp);
                }
            }
        }
    
        void addin(multiset<int> &lmax, multiset<int> &rmin, int v)
        {
            if(lmax.empty())
            {
                lmax.insert(v);
                return;
            }
            int lmax_v = *lmax.rbegin();
            int size_l = lmax.size(), size_r = rmin.size();
            if(v <= lmax_v) // to add left
            {
                lmax.insert(v);
                if((size_l + 1 - size_r) > 1)
                {
                    int tmp = *lmax.rbegin();
                    rmin.insert(tmp);
                    removeOnly1(lmax, tmp);
                }
            }
            else
            {
                rmin.insert(v);
                if((size_r  + 1)> size_l)
                {
                    int tmp = *rmin.begin();
                    removeOnly1(rmin, tmp);
                    lmax.insert(tmp);
                }
            }
        }
    public:
        /**
         * @param nums: A list of integers.
         * @return: The median of the element inside the window at each moving
         */
        vector<int> medianSlidingWindow(vector<int> &nums, int k) {
            vector<int> ret;
    
            multiset<int> lmax, rmin; // sizeof(lmax) - sizeof(rmin) -> [0,1]
    
            size_t n = nums.size();
            for(int i = 0; i < n; i ++)
            {
                if(i >= k)
                {
                    remove(lmax, rmin, nums[i - k]);
                }
    
                //
                addin(lmax, rmin, nums[i]);
                //
                if(i >= k - 1)
                {
                    ret.push_back(*lmax.rbegin());
                }
            }
            return ret;
        }
    };
    View Code
  • 相关阅读:
    js学习笔记
    在 Windows 下远程桌面连接 Linux XManager 篇
    使用多种反病毒引擎扫描文件
    光纤接口小知识
    在 Windows 下远程桌面连接 Linux VNC 篇
    基于 RHEL 的 CentOS 5.5 发布
    安装Windows 7的XP模式的步骤
    跨平台加密版 SQLite 3 wxSQLite3
    Free 的迷思
    使用 iptables 限制黑客猜密码
  • 原文地址:https://www.cnblogs.com/tonix/p/4882346.html
Copyright © 2011-2022 走看看