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

news2024/9/23 1:25:24

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

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

实现 MovingAverage 类:

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

示例:

  • 输入:
    • inputs = [“MovingAverage”, “next”, “next”, “next”, “next”]
    • inputs = [[3], [1], [10], [3], [5]]
  • 输出:
    • [null, 1.0, 5.5, 4.66667, 6.0]
  • 解释:
    • MovingAverage movingAverage = new MovingAverage(3);
    • movingAverage.next(1); // 返回 1.0 = 1 / 1
    • movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
    • movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
    • movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3

提示:

  • 1 <= size <= 1000
  • -10^5 <= val <= 10^5
  • 最多调用 next 方法 10^4 次

题目思考

  1. 可以使用什么数据结构模拟整个过程?
  2. 如何优化时间复杂度?

解决方案

思路

  • 分析题目, 要想动态维护最后 size 个元素, 需要支持一端添加新元素, 另一端移除老元素, 显然可以使用双端队列来模拟这个过程
  • 每次调用 next 函数时, 先将新元素添加到队列中, 然后判断队列长度, 如果超过了 size, 则弹出另一端最老的元素
  • 这样就保证了队列里存储的是滑动窗口的有效元素, 将它们的和除以元素个数, 就是当前窗口平均值
  • 我们还可以利用后缀和进一步优化, 添加或弹出元素时分别将后缀和加上或减去对应元素, 这样就把计算窗口元素和的时间复杂度从 O(size) 优化到了 O(1)
  • 下面的代码就对应了上面的整个过程, 并且有详细的注释, 方便大家理解

复杂度

  • 时间复杂度 O(1): next 函数只需要几次 O(1)的操作
  • 空间复杂度 O(size): 需要额外双端队列存储 size 个元素

代码

class MovingAverage:
    def __init__(self, size: int):
        # 双端队列+后缀和
        self.size = size
        self.window = collections.deque()
        self.sum = 0

    def next(self, val: int) -> float:
        self.window.append(val)
        self.sum += val
        if len(self.window) > self.size:
            # 超出大小了, 移除最左侧元素并更新后缀和
            self.sum -= self.window.popleft()
        return self.sum / len(self.window)

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman —— postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数每…

【Luniux】解决Ubuntu外接显示器不显示的问题

Luniux】解决Ubuntu外接显示器不显示的问题 文章目录 Luniux】解决Ubuntu外接显示器不显示的问题1. 检查nvidia显卡驱动是否正常2. 更新驱动3. 检查显示器是否能检测到Reference 1. 检查nvidia显卡驱动是否正常 使用命令行 nvidia-smi来检查显卡驱动是否正常&#xff0c;如果…

【ArcGIS微课1000例】0074:ArcGIS热点分析(Getis-Ord Gi*)---犯罪率热点图

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、热点分析工具介绍二、ArcGIS热点分析案例1. 普通热点分析2. 加…

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置&#xff08;所有主机操作&#xff09; 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…

华为OD机试 - 按索引范围翻转文章片段 - 字符串(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

下载的文件被Windows 11 安全中心自动删除

今天从CSDN上下载了自己曾经上传的文件&#xff0c;但是浏览器下载完之后文件被Windows安全中心自动删除&#xff0c;说是带病毒。实际是没有病毒的&#xff0c;再说了即便有病毒也不应该直接删除啊&#xff0c;至少给用户一个保留或删除的选项。 研究了一番&#xff0c;可以暂…

【ArcGIS微课1000例】0072:如何生成空间权重矩阵

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、空间权重矩阵工具介绍二、ArcGIS生成空间权重矩阵三、注意事项…

虚拟机软件的优点是什么?缺点又是什么?

虚拟机软件想必对于使用MacBook的小伙伴来说并不陌生&#xff0c;安装上虚拟机后我们就能够模拟Windows的环境从而下载一些Mac不支持的软件。尽管Mac的操作系统用起来流畅快捷&#xff0c;但是在日常使用过程中还是会存在一些不便之处。 很多用户非常依赖使用虚拟机软件&#…

一种IDEA疑难杂症的解决办法

解决办法 重启IDEA 针对于IDEA各种解析&#xff0c;运行时问题&#xff0c;但是无法通过搜索引擎得到答案的问题请试试此方法。 删除根目录下[.idea]文件夹后重启 此文件夹为idea首次导入项目时根据项目情况自动生成的配置文件。方便idea下次更快的解析项目。但是某些情况&a…

java.lang.NullPointerException问题

nullpointerexception可能是哪个地方没加注解 例如Service注解没有加

微信小程序报错: SyntaxError: Cannot use import statement outside a module

微信小程序数据绑定&#xff0c;导包出现了: “SyntaxError: Cannot use import statement outside a module” 排查问题步骤记录&#xff0c;共勉 1.出现问题代码&#xff1a; import {createStoreBindings} from "mobx-miniprogram-bindings"import {store} from …

1. 学习 K8S: Docker 基础

学习 K8S: Docker 基础 1. Docker 的诞生 1.1 首次展示 2013 年 3 月 15 日&#xff0c;在北美的圣克拉拉市召开了一场 Python 开发者社区的主题会议 PyCon&#xff0c;研究和探讨各种 Python 开发技术和应用&#xff0c; 在当天的会议日程快结束时&#xff0c;有一位名为 S…

优化器调整策略

损失函数的作用是衡量模型输出与真实标签的差异。当我们有了这个loss之后&#xff0c;我们就可以通过反向传播机制得到参数的梯度&#xff0c;那么我们如何利用这个梯度进行更新参数使得模型的loss逐渐的降低呢&#xff1f; 优化器的作用 Pytorch的优化器&#xff1a; 管理并…

校对的力量:当专业遇上细节,文字焕发新生

在这个信息爆炸的时代&#xff0c;文字成为了我们传达思想、展现形象的重要工具。从新闻稿、政府材料到商业文档&#xff0c;其背后的准确性和专业性往往决定了信息传递的效果。而保证这一切的&#xff0c;就是细致入微的校对工作。 1.错别字与校对&#xff1a;细节之美 错别字…

单机MySQL的演进

2、单机MySQL的演进 我们当前处于大数据时代&#xff0c;大数据一般的数据库无法进行分析处理了&#xff01;2006年发布了Hadoop 1、单机MySQL的年代 某知名购物网站最开始就是到国外购买的PHP网站&#xff0c;拿过来就能直接使用&#xff0c;到后来也改成了Java。早期网站的数…

【Flutter】Flutter 使用 just_audio 播放音频

【Flutter】Flutter 使用 just_audio 播放音频 文章目录 一、前言二、环境与版本信息三、安装和基本使用四、深入 just_audio五、实际业务中的用法六、完整示例七、总结 一、前言 今天&#xff0c;我要为你介绍一个非常实用的 Flutter 音频处理包——just_audio。这个包不仅功…

IDEA软件安装包分享

目录 一、软件简介 二、软件下载 一、软件简介 IntelliJ IDEA是一款流行的Java集成开发环境&#xff08;IDE&#xff09;&#xff0c;由捷克软件开发公司JetBrains开发。它专为Java开发人员设计&#xff0c;提供了许多高级功能和工具&#xff0c;使得开发人员能够更高效地编写…

《深入理解Java虚拟机》读书笔记:运行时栈帧结构

代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步。 一、概述 在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型&#xff0c;这个概念模型成为各种虚拟机执行引擎的统一外观&#xff08;Facade&#x…

FrameWork之旅 -- Android_input浅析

最近工作超级忙&#xff0c;周末了&#xff0c;看了下博客&#xff0c;今年居然没有更新过博客&#xff0c;看来还是搬砖太忙了。通过3个小时的代码梳理后&#xff0c;下图是个人对input的简单分析&#xff0c;后面如果有精力&#xff0c;会有更新。

AcWing算法提高课-5.5.1可见的点

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 在一个平面直角坐标系的第一象限内&#xff0c;如果一个点 ( x , y ) (x,y) (x,y) 与原点 ( 0 , 0 ) (0,0) (0,0) 的连线中没有通过其他任何点&#xff0c;则称该点在原点处是可见的。…