346. 数据流中的移动平均值 🔒
题目描述
给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。
实现 MovingAverage
类:
MovingAverage(int size)
用窗口大小size
初始化对象。double next(int val)
计算并返回数据流中最后size
个值的移动平均值。
示例:
输入: ["MovingAverage", "next", "next", "next", "next"] [[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
次
解法
方法一:循环数组
我们定义一个变量 \(\textit{s}\),用于计算当前最后 \(\textit{size}\) 个元素的和,用一个变量 \(\textit{cnt}\) 记录当前元素的总数。另外,我们用一个长度为 \(\textit{size}\) 的数组 \(\textit{data}\) 记录每个位置的元素对应的值。
调用 \(\textit{next}\) 函数时,我们先计算出 \(\textit{val}\) 要存放的下标 \(i\),然后我们更新元素和 \(s\),并且将下标 \(i\) 处的值设置为 \(\textit{val}\),同时将元素的个数加一。最后,我们返回 \(\frac{s}{\min(\textit{cnt}, \textit{size})}\) 的值即可。
时间复杂度 \(O(1)\),空间复杂度 \(O(n)\),其中 \(n\) 是题目给定的整数 \(\textit{size}\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
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 |
|
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
方法二:队列
我们可以使用一个队列 \(\textit{q}\) 来存储最后 \(\textit{size}\) 个元素,同时用一个变量 \(\textit{s}\) 来记录这 \(\textit{size}\) 个元素的和。
在调用 \(\textit{next}\) 函数时,我们首先判断队列 \(\textit{q}\) 的长度是否等于 \(\textit{size}\),如果等于 \(\textit{size}\),则将队列 \(\textit{q}\) 的头部元素出队,并且更新 \(\textit{s}\) 的值。然后将 \(\textit{val}\) 入队,并且更新 \(\textit{s}\) 的值。最后返回 \(\frac{s}{\text{len}(q)}\) 的值即可。
时间复杂度 \(O(1)\),空间复杂度 \(O(n)\),其中 \(n\) 是题目给定的整数 \(\textit{size}\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
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 |
|
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|