【简单】力扣算法题解析LeetCode346:数据流中的移动平均值
LeetCode 346题,要求设计一个实时计算数据流移动平均值的类MovingAverage。核心方案采用队列维护滑动窗口,通过动态维护总和实现O(1)时间复杂度。初始化时设定窗口大小,每次添加新值自动调整队列:若满则移除最早元素并更新总和,新值入队后重新计算平均值。Java实现使用LinkedList队列,确保高效操作(插入/删除O(1))和精确计算(double类型总和)。
·
题目来源:🔒LeetCode 346. 数据流中的移动平均值
问题抽象: 设计一个 MovingAverage 类,用于实时计算数据流中 固定窗口大小 的移动平均值,满足以下核心需求:
-
核心功能:
- 初始化时指定窗口大小
size; - 每次调用
next(val)时:- 将新值
val加入窗口末尾; - 若窗口元素数超过
size,则移除最早加入的值; - 返回当前窗口内所有元素的 算术平均值(浮点数)。
- 将新值
- 初始化时指定窗口大小
-
计算约束:
- 时间复杂度 O(1):单次
next操作需常数时间(避免遍历求和); - 空间复杂度 O(size):存储窗口元素(队列或循环数组);
- 利用 累加和优化:维护窗口元素和,更新时减去移出值、加上新值。
- 时间复杂度 O(1):单次
-
边界处理:
- 初始空窗口:
next(1)返回1.0(仅一个元素); - 窗口未满:平均值按实际元素数计算(如
size=3时,前两次调用取2个元素的平均值); - 窗口已满:移除最早元素(如
size=3时,第四次调用移除第一个元素); - 特殊输入:
size=0时返回0(但题目保证size>0)。
- 初始空窗口:
类定义:
class MovingAverage:
def __init__(self, size: int): # 初始化窗口大小
def next(self, val: int) -> float: # 添加新值并返回当前平均值
解题思路
题目要求实现一个 MovingAverage 类,用于计算数据流中最近 size 个元素的移动平均值。核心思路如下:
- 数据结构选择:使用队列(
Queue)存储数据流元素,队列天然支持先进先出(FIFO),适合维护滑动窗口。 - 维护窗口和总和:
- 初始化时记录窗口大小
size,初始化队列和总和变量sum。 - 每次添加新元素时:
- 若队列已满(达到
size),移除队首元素并从sum中减去该值。 - 将新元素加入队列,并累加到
sum。
- 若队列已满(达到
- 初始化时记录窗口大小
- 计算平均值:用当前总和
sum除以队列中实际元素数量(可能小于size),直接返回结果。 - 时间复杂度:
next()操作时间复杂度为 O ( 1 ) O(1) O(1),空间复杂度为 O ( s i z e ) O(size) O(size)。
代码实现(Java版)🔥点击下载源码
class MovingAverage {
private final int size; // 滑动窗口大小
private double sum; // 窗口内元素总和
private Queue<Integer> queue; // 存储元素的队列
public MovingAverage(int size) {
this.size = size;
this.sum = 0.0;
this.queue = new LinkedList<>();
}
public double next(int val) {
// 当队列大小达到窗口大小时,移除队首元素并更新总和
if (queue.size() == size) {
sum -= queue.poll();
}
// 新元素入队并更新总和
queue.offer(val);
sum += val;
// 计算平均值:总和 / 当前队列元素个数
return sum / queue.size();
}
}
代码说明
- 初始化:
size存储滑动窗口大小。sum初始化为0.0,用于动态维护窗口内元素总和。queue使用LinkedList实现队列,支持高效入队(offer)和出队(poll)操作。
- next() 方法:
- 队列满处理:当队列元素数量等于
size时,移除队首元素并从sum中减去该值。 - 新元素入队:将新元素加入队尾,并累加到
sum。 - 计算平均值:用当前
sum除以队列实际大小(可能小于size),直接返回平均值。
- 队列满处理:当队列元素数量等于
- 优势:
- 高效:每次操作仅涉及一次出队和一次入队,时间复杂度 O ( 1 ) O(1) O(1)。
- 低内存:队列最多存储
size个元素,空间复杂度 O ( s i z e ) O(size) O(size)。 - 精确:使用
double维护总和,避免整数除法精度损失。

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐



所有评论(0)