当前位置:网站首页>剑指 Offer II 041. 滑动窗口的平均值

剑指 Offer II 041. 滑动窗口的平均值

2022-07-08 00:03:00 小白码上飞

一句话概要

使用队列实现,保证队列长度为滑动窗口的大小。即元素超出后从队列前移除。

题目

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

实现 MovingAverage 类:

MovingAverage(int size) 用窗口大小 size 初始化对象。

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

img

链接:https://leetcode.cn/problems/qIsx9U

思路

就是说,窗口大小是固定的,当窗口里的元素个数不足窗口大小时,将整数加入窗口,并直接计算平均值。

如果如果新增整数后,个数超过窗口大小,则需要将最前面的元素剔除。

先进先出,那就是队列了。

解法:使用队列

代码

public class MovingAverage {
    
    Queue<Integer> queue = new LinkedList<>();
    int maxSize;
    int size;
    int total;

    /** * Initialize your data structure here. */
    public MovingAverage(int size) {
    
        maxSize = size;
    }

    public double next(int val) {
    
        // 当前值入队列
        queue.add(val);
        total += val;
        if (size >= maxSize) {
    
            Integer poll = queue.poll();
            total = total - poll;
        } else {
    
            size++;
        }
        return (double) total / (double) size;
    }
}

提交结果

img

扩展知识点:队列

常用api

队列,即先进先出。

Java中的队列,需要实现Queue这个接口。

常用api的定义:

  • boolean offer(E e)队尾添加元素。空间不够则返回false。
  • E poll()队头移除元素。如果队列为空,则返回null。
  • E peek()获取队头元素,不移除。如果队列为空,则返回null。
  • boolean add(E e)队尾添加元素。空间不够则抛出异常。
  • E remove()队头移除元素。如果队列为空,则抛出异常
  • E element()获取队头元素,不移除。如果队列为空,则抛出异常

我们经常使用到的实现,都是用LinkedList来实现Queue。而因为LinkedList是个链表,因此不涉及到空间的限制,offer方法的实现本质上就是调用了add方法。

img

原网站

版权声明
本文为[小白码上飞]所创,转载请带上原文链接,感谢
https://blog.csdn.net/u011291072/article/details/125650084