剑指offer041-滑动窗口的平均值

滑动窗口的平均值

Posted by 高明 on 2020-01-01

剑指offer041-滑动窗口的平均值

题目

给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。

实现 MovingAverage 类:

  • MovingAverage(int size) 用窗口大小 size 初始化对象。
  • double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后 size 个值的移动平均值,即滑动窗口里所有数字的平均值。

 

示例:

输入:
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出:
[null, 1.0, 5.5, 4.66667, 6.0]

解释:
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3

 

提示:

  • 1 <= size <= 1000
  • -105 <= val <= 105
  • 最多调用 next 方法 104

 

注意:本题与主站 346 题相同: https://leetcode-cn.com/problems/moving-average-from-data-stream/

Related Topics
  • 设计
  • 队列
  • 数组
  • 数据流

  • 👍 9
  • 👎 0
  • 给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。

    实现 MovingAverage 类:

    • MovingAverage(int size) 用窗口大小 size 初始化对象。
    • double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后 size 个值的移动平均值,即滑动窗口里所有数字的平均值。

     

    示例:

    输入:
    inputs = ["MovingAverage", "next", "next", "next", "next"]
    inputs = [[3], [1], [10], [3], [5]]
    输出:
    [null, 1.0, 5.5, 4.66667, 6.0]
    
    解释:
    MovingAverage movingAverage = new MovingAverage(3);
    movingAverage.next(1); // 返回 1.0 = 1 / 1
    movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
    movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
    movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
    

     

    提示:

    • 1 <= size <= 1000
    • -105 <= val <= 105
    • 最多调用 next 方法 104

     

    注意:本题与主站 346 题相同: https://leetcode-cn.com/problems/moving-average-from-data-stream/

    Related Topics
  • 设计
  • 队列
  • 数组
  • 数据流

  • 👍 9
  • 👎 0
  • 思路

    维护一个队列,进队列和出队列

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class MovingAverage {

    private Deque<Integer> deque;

    private double s = 0;

    private int dequeSize = 0;

    private int maxSize;

    /**
    * Initialize your data structure here.
    */
    public MovingAverage(int size) {
    deque = new ArrayDeque<>(3);
    maxSize = size;
    }

    public double next(int val) {
    double res;
    if (deque.size() < maxSize) {
    // 增加
    res = add(val);
    } else {
    // 删除
    remove();
    //增加
    res = add(val);
    }
    return res;
    }

    public void remove() {
    Integer value = deque.pop();
    dequeSize--;
    s -= value;
    }

    public double add(int val) {
    deque.add(val);
    dequeSize++;
    s += val;
    return dequeSize == 0 ? 0 : s / dequeSize;
    }
    }