: 346. Moving Average from Data Stream
leetcode easy
Task
Дан поток целых чисел и размер окна, вычислите скользящее среднее всех целых чисел в скользящем окне.
Реализуйте класс MovingAverage:
MovingAverage(int size) Инициализирует объект с размером окна size.
double next(int val) Возвращает скользящее среднее последних size значений потока.
Пример
Input
["MovingAverage", "next", "next", "next", "next"]
[[3], [1], [10], [3], [5]]
Output
[null, 1.0, 5.5, 4.66667, 6.0]
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class MovingAverage {
private int size;
private Queue<int> queue;
private int sum;
public MovingAverage(int size) {
this.size = size;
this.queue = new Queue<int>();
this.sum = 0;
}
public double Next(int val) {
queue.Enqueue(val);
sum += val;
if (queue.Count > size) {
sum -= queue.Dequeue();
}
return (double)sum / queue.Count;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class MovingAverage {
private int size;
private queue<int> queue;
private int sum;
public MovingAverage(int size) {
this.size = size;
this.queue = new queue<int>();
this.sum = 0;
}
public double Next(int val) {
queue.Enqueue(val);
sum += val;
if (queue.size() > size) {
sum -= queue.Dequeue();
}
return (double)sum / queue.size();
}
}Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class MovingAverage {
private int size;
private Queue<int> queue;
private int sum;
public MovingAverage(int size) {
this.size = size;
this.queue = new LinkedList<int>();
this.sum = 0;
}
public double Next(int val) {
queue.Enqueue(val);
sum += val;
if (queue.size() > size) {
sum -= queue.poll();
}
return (double)sum / queue.size();
}
}Explanation
Algorithm
Инициализация:
Инициализируйте объект с фиксированным размером окна size.
Используйте очередь или список для хранения значений в текущем окне.
Храните текущую сумму значений в окне.
Добавление нового значения:
Добавьте новое значение в очередь.
Обновите текущую сумму, добавив новое значение.
Если размер очереди превышает size, удалите самое старое значение и обновите сумму, вычтя это значение.
Вычисление скользящего среднего:
Возвращайте текущее скользящее среднее как сумму значений в окне, деленную на количество значений в окне.
😎