算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)

Posted stormzhuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)相关的知识,希望对你有一定的参考价值。

1. 题目

这是LeetCode上的 [041,滑动窗口的平均值],难度为 [简单]

2. 题解

2.1 思路分析

根据题意,模拟滑动窗口的过程,如下

假设滑动窗口的大小为3,当第1次调用next函数时在滑动窗口中添加整数1,此时窗口中只有一个数字1,因此返回平均值为1。如下所示


当第2次调用next函数时添加整数2,此时窗口中有两个数字1,2,因此返回平均值为1.5,如下所示

当第3次调用next函数时添加整数3,此时窗口中有三个数字1,2,3,因此返回平均值2,如下所示


第4次次调用next函数时添加数字4,由于受到窗口大小的限制,滑动窗口中最多只能有3个数字,因此第1个数字1将滑出窗口,此时窗口中包含3个数字2,3,4,返回平均值3,如下所示


总结: 每次调用next函数时,可以向滑动窗口添加一个值,并算出滑动窗口的所有值的平均值,若在滑动窗口的已满的情况下添加一个值,需要把滑动窗口最先添加的值删除掉,因此满足先出先出的特点,可以使用队列模拟滑动窗口

平均值的计算

方式1: 一种直观的方法是每次调用next函数时都累加窗口中的所有值之和,然后除于窗口的大小。如果窗口的大小为n,那么每次计算的平均值的时间复杂度为O(n)

方式2: 如果每次调用next函数添加值时,都把添加的值累加到一个数中(用sum表示),即sum + val。若在滑动窗口的已满的情况下添加一个值,还需要把sum的值减去最先添加的值,因此最多只需一次加法和减法就可以算出所有数之和,故时间复杂度为O(1)

2.2 代码实现

class MovingAverage 
    private Queue<Integer> nums;
    private int capacity;
    private double sum;
    public MovingAverage(int size) 
        // 创建一个队列模拟滑动窗口
        nums = new LinkedList<>();
        // 初始滑动窗口的大小
        capacity = size;
    

    public double next(int val) 
        // 在滑动窗口中添加一个值
        // 把添加的值累加到sum中
        nums.offer(val);
        sum += val;
       /* 若队列的大小超过滑动窗口的大小,需要删除滑动窗口最先添加的值
       * 并把删除的值从sum中减去*/
        if (nums.size() > capacity) 
            sum -= nums.poll();
        
        return sum / nums.size();
    

以上是关于算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)

算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)

算法leetcode剑指 Offer II 041. 滑动窗口的平均值(rust重拳出击)

算法leetcode剑指 Offer II 041. 滑动窗口的平均值(rust重拳出击)

每日一题剑指 Offer II 041. 滑动窗口的平均值

LeetCode 剑指Offer II 041滑动窗口的平均值[滑动窗口] HERODING的LeetCode之路