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
  • 相关阅读:
    Guid ToString 格式
    SQL Server 自增字段归零
    一些被触动的话
    【简易教程】在网站上养一只萌咔咔的小仓鼠
    SQL分页语句
    WPF使用System.Windows.SystemParameters类获得屏幕分辨率
    WPF编程学习——窗口
    C# .net WPF无边框移动窗体
    WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
    转 遗传算法简介
  • 原文地址:https://www.cnblogs.com/tonix/p/4882346.html
Copyright © 2011-2022 走看看