• 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计


    [抄题]:

    Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.

    For example,

    MovingAverage m = new MovingAverage(3);
    m.next(1) = 1
    m.next(10) = (1 + 10) / 2
    m.next(3) = (1 + 10 + 3) / 3
    m.next(5) = (10 + 3 + 5) / 3

     [暴力解法]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    以为要分情况讨论除数,没有想数据结构

    [一句话思路]:

    用queue的动态长度避免分类讨论

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. queue刚满足等于时就应除,不够警惕,下次注意
    2. 动态计算时可以初始化为0,不能在方法中重置为0,下次注意

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    API design的题就是在类中声明引用,在方法中和实际的对象发生连接

    1. queue的实现(具体对象)是linkedlist,都是一条,不难想象. queue用add也没事

    [关键模板化代码]:

    先说引用,再说对象

    Queue<Integer> q;
        int s;
        double sum;
        
        public MovingAverage(int size) {
            q = new LinkedList<Integer>();
            s = size;
            sum = 0;
        }

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    class MovingAverage {
    
        /** Initialize your data structure here. */
        Queue<Integer> q;
        int s;
        double sum;
        
        public MovingAverage(int size) {
            q = new LinkedList<Integer>();
            s = size;
            sum = 0;
        }
        
        public double next(int val) {
            //when the queue just equals the size, poll it out
            if (q.size() == s) {
                sum -= q.poll();   
            }
            q.add(val);
            sum += val;
            return sum / q.size();
        }
    }
    
    /**
     * Your MovingAverage object will be instantiated and called as such:
     * MovingAverage obj = new MovingAverage(size);
     * double param_1 = obj.next(val);
     */
    View Code
  • 相关阅读:
    验证或是提示字段请求值
    正则表达式模式
    Linux下squid代理缓存服务环境部署
    memcached缓存知识简单梳理
    MySQL 读写分离方案-Amoeba环境部署记录
    linux系统终端命令提示符设置(PS1)记录
    Gitlab快速部署及日常维护(社区版RPM包方式安装)
    Linux下检测IP地址冲突及解决方法
    Linux如何挂载Windows下的共享文件
    定时备份Windows文件到Linux服务器上(Rsync)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8551716.html
Copyright © 2020-2023  润新知