: 346. Moving Average from Data Stream

LeetCode easy оригинал: C# #csharp #design #easy #leetcode #queue #sliding-window

Дан поток целых чисел и размер окна, вычислите скользящее среднее всех целых чисел в скользящем окне.

Реализуйте класс 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# решение

сопоставлено/оригинал
using 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++ решение

auto-draft, проверить перед отправкой
#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 решение

auto-draft, проверить перед отправкой
import 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();
    }
}

Algorithm

Инициализация:

Инициализируйте объект с фиксированным размером окна size.

Используйте очередь или список для хранения значений в текущем окне.

Храните текущую сумму значений в окне.

Добавление нового значения:

Добавьте новое значение в очередь.

Обновите текущую сумму, добавив новое значение.

Если размер очереди превышает size, удалите самое старое значение и обновите сумму, вычтя это значение.

Вычисление скользящего среднего:

Возвращайте текущее скользящее среднее как сумму значений в окне, деленную на количество значений в окне.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.