LeetCode 2090. 半径为 k 的子数组平均值

题目链接

2090. 半径为 k 的子数组平均值

题目描述

给定一个下标从 0 开始的整数数组 nums 和整数 k,构建并返回一个长度为 n 的数组 avgs,其中 avgs[i] 表示以下标 i 为中心、半径为 k 的子数组的平均值。具体规则如下:

  • 无效位置:若 i 左侧不足 k 个元素(i - k < 0)或右侧不足 k 个元素(i + k >= n),则 avgs[i] = -1
  • 有效位置:若 i 前后均有至少 k 个元素(即子数组下标范围为 [i-k, i+k],共 2k+1 个元素),则 avgs[i] 为该子数组元素的平均值(使用截断式整数除法,直接舍去小数部分)。

解法分析

代码实现

from typing import List  class Solution:  def getAverages(self, nums: List[int], k: int) -> List[int]:  s = 0  # 滑动窗口内元素的和  ans = [-1] * len(nums)  # 初始化结果数组,默认所有位置无效  for i in range(len(nums)):  s += nums[i]  # 将当前元素加入窗口和  if i < k * 2:  continue  # 窗口未形成完整长度时跳过计算  ans[i - k] = s // (2 * k + 1)  # 计算中心位置的平均值  s -= nums[i - 2 * k]  # 滑动窗口,移除左边界元素  return ans  

代码详细分析

1. 初始化操作
  • s(窗口和):用于存储当前滑动窗口内所有元素的和,初始化为 0。随着遍历进行,逐个累加数组元素,并在窗口滑动时减去离开窗口的元素,保持动态更新。
  • ans(结果数组):初始化为全 -1,表示所有位置默认无效。后续有效位置会被覆盖为对应的平均值,无需额外处理无效位置的边界条件。
2. 遍历数组与窗口扩展
  • 右指针 i:从 0 开始遍历数组的每个元素,每次将 nums[i] 加入窗口和 s,相当于将窗口的右边界扩展到当前元素 i
  • 窗口形成条件:当 i < 2k 时,窗口内元素个数为 i+1,而有效窗口需要 2k+1 个元素(例如 k=1 时需要3个元素,i=1 时只有2个),此时跳过计算,继续扩展窗口。
3. 有效窗口处理
  • 窗口完整时:当 i >= 2k 时,窗口包含从 i-2ki2k+1 个元素(例如 k=3i=6 时,窗口范围是 [0,6],共7个元素),此时窗口以 i-k 为中心(左边界 i-2k 右移 k 步到达中心)。
  • 平均值计算:使用截断式整数除法 s // (2k+1),直接舍去小数部分,符合题目要求。
4. 窗口滑动更新
  • 移除左边界元素:在计算完当前中心位置的平均值后,下一个窗口的左边界需要右移一位,即移除 nums[i-2k](当前窗口的最左元素),确保下一次遍历的窗口大小仍为 2k+1。例如,当 i=6 处理完后,下一个窗口左边界从 0 变为 1,窗口范围变为 [1,7]

案例分析

以 LeetCode 示例输入为例:
输入nums = [7,4,3,9,1,8,5,2,6], k = 3
输出[-1,-1,-1,5,4,4,-1,-1,-1]

分步计算过程

  1. 窗口大小2k+1 = 7,有效中心位置需满足 i-3 >= 0i+3 < 9,即 i ∈ [3, 5](对应结果数组下标3、4、5)。

  2. 遍历过程

    • i=6(下标6,元素5)
      • 窗口和 s = 7+4+3+9+1+8+5 = 37
      • i >= 2k=6,中心位置为 6-3=3ans[3] = 37 // 7 = 5
      • 移除左边界元素 nums[0]=7s = 37-7=30
    • i=7(下标7,元素2)
      • 加入当前元素2,s = 30+2=32
      • 中心位置为 7-3=4ans[4] = 32 // 7 = 4
      • 移除左边界元素 nums[1]=4s = 32-4=28
    • i=8(下标8,元素6)
      • 加入当前元素6,s = 28+6=34
      • 中心位置为 8-3=5ans[5] = 34 // 7 = 4
      • 移除左边界元素 nums[2]=3,但遍历结束,无需继续处理。
  3. 结果数组

    • 无效位置(如 i=0,1,2,6,7,8 因边界不足)保持初始值 -1,有效位置 3、4、5 分别赋值为 5、4、4,最终结果与示例一致。

总结

方法优势

  • 线性时间复杂度O(n),每个元素仅被访问一次,窗口滑动和计算平均值均为常数时间操作,避免了暴力解法中每次计算子数组和的 O(k) 复杂度。
  • 简洁的边界处理:通过初始化结果数组为 -1,自动处理所有无效位置,无需额外判断 i-k < 0i+k >= n,代码逻辑清晰。
  • 空间高效:除结果数组外,仅使用常数级额外空间(s 和循环变量),适用于处理大规模数据(如 n=10^5)。

关键细节

  • 窗口长度:固定为 2k+1,确保覆盖中心 i 左右各 k 个元素。
  • 整数除法:使用 // 运算符实现截断式除法,直接舍去小数部分,符合题目要求(例如 37//7=5,而非四舍五入)。
  • 滑动窗口逻辑:每次右边界扩展后,仅当窗口完整时(i >= 2k)才计算中心位置,避免无效计算。

适用场景

该解法适用于所有「固定长度子数组求均值/和」的问题,例如:

  • 求每个长度为 m 的子数组的和;
  • 求滑动窗口内元素的平均值或其他统计量(需调整窗口大小和计算逻辑)。

通过滑动窗口技术,可高效解决此类问题,是处理定长子数组问题的经典模板之一。

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

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

相关文章

深入理解C++11原子操作:从内存模型到无锁编程

文章目录 C并发编程的新纪元内存模型基础&#xff1a;可见性与有序性数据竞争的根源happens-before关系memory_order枚举详解1. memory_order_relaxed2. memory_order_acquire/memory_order_release3. memory_order_seq_cst 原子操作详解std::atomic模板核心原子操作1. 读取与存…

DQL-1-基础查询

基础查询 DQL-1-基础查询 基础查询DQL - 介绍DQL - 语法DQL - 基本查询案例 DQL - 介绍 SQL 英文全称是 Data Query Language, 数据查询语言, 用来查询数据库中表的记录 查询关键字: SELECT DQL - 语法 SELECT 字段列表FROM 表名列表WHERE条件列表GROUP BY分组字段列表HAVI…

Prompt 精通之路(七)- 你的终极 AI 宝典:Prompt 精通之路系列汇总

你的终极 AI 宝典&#xff1a;Prompt 精通之路系列汇总 标签&#xff1a; #Prompt指南 #AI学习资源 #速查手册 #ChatGPT #系列总结 &#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么…

P27:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、过程解读 PyTorch 实战&#xff1a;阿尔茨海默病数据预测模型 今天&#xff0c;我将带大家一起探索一个基于 PyTorch 的深度学习小项目——利用 RNN 模…

HakcMyVM-Arroutada

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-01 07:13 EDT Nmap scan report for 192.168.21.11 Host is up (0.00062s latency). MAC Address: 08:00:27:4E:CC:FB (PCS Systemtechnik/Or…

TEXT Submitting Solutions

前言 USACO 训练项目配备了一个自动评分系统&#xff0c;用于批改你的作业题目。你可以直接在题目页面提交你的程序&#xff1b;系统会对程序进行编译和评分&#xff0c;几秒钟内就能将结果反馈给你。 支持的语言有 C、C&#xff08;含 C11 和 C14&#xff09;、PASCAL、Pyth…

Reactor 瞬态错误

在响应式编程中&#xff0c;retryWhen 操作符通过 RetrySignal 接口提供了对重试行为的精细控制&#xff0c;特别是在处理 瞬态错误&#xff08;transient errors&#xff09; 时。瞬态错误是指那些在一段时间内发生&#xff0c;但随后会自行恢复的错误&#xff0c;例如网络请求…

基于 SpringBoot+Vue.js+ElementUI 的小型超市商品管理系统设计与实现7000字论文设计

摘要 本论文设计并实现了一个基于 SpringBoot、Vue.js 和 ElementUI 的小型超市商品管理系统。该系统旨在为小型超市提供一个高效、便捷的商品管理解决方案&#xff0c;实现商品信息的录入、查询、修改、删除等功能&#xff0c;同时支持库存管理、销售统计等业务需求。论文首先…

Kerberos 认证协议解析

文章目录 概述核心概念认证流程阶段一&#xff1a;Client -> AS&#xff0c;获取 TGT阶段二&#xff1a;Client -> TGS&#xff0c;获取服务票据阶段三&#xff1a;Client -> Server&#xff0c;请求服务 核心安全机制优缺点分析优势局限性 实践与排错关键配置 (krb5.…

【设计模式07】适配器

前言 实现目标&#xff0c;组合源&#xff0c;写个适配方法&#xff0c;适用于没办法改变源&#xff0c;但又想实现目标类。我暂时还没使用到过&#xff0c;但感觉用处还是蛮大的 UML类图 代码示例 package com.sw.learn.pattern.C_structre.a_adapter;public class Main {//…

SPI、I2C和UART三种串行通信协议的--------简单总结

目录 一、3种协议的对比二、典型应用场景三、选型建议 以下是SPI、I2C和UART三种串行通信协议的对比分析及适用场景总结&#xff1a; 一、3种协议的对比 . 对比其他接口 特性ICSPIUART信号线数量2&#xff08;SCL SDA&#xff09;4&#xff08;SCK MOSI MISO SS/CS&…

VUE admin-element 后台管理系统三级菜单实现缓存

VUE admin-element 后台管理系统三级菜单实现缓存 框架无法直接实现三级菜单页面缓存&#xff0c;原因是由于直接缓存时没有把上级路由文件名称缓存进去&#xff0c;所以在框架基础上参考部分文章进行了一些改造 菜单文件&#xff0c;三级菜单引用文件路径修改&#xff0c;在…

【笔记】Windows 安装 Gemini CLI

2025 年 07 月 02 日 Windows 安装 Gemini CLI google-gemini/gemini-cli&#xff1a;一个开源的 AI 代理&#xff0c;可将 Gemini 的强大功能直接引入您的终端。 一、前置条件 系统要求&#xff1a;Windows 7 及以上版本。 Node.js 环境&#xff1a;Gemini CLI 基于 Node.js …

transformers==4.42.0会有一个BUG

transformers4.42.0版本下&#xff0c;自动安装模型时出现一个BUG&#xff08;自动从Hugging Faces上下载&#xff09;。 2025-07-02 14:07:08,641 - __main__ - ERROR - 模型加载失败: Failed to import transformers.models.llama.tokenization_llama_fast because of the f…

Spring-解决IDEA中无法创建JDK17一下的SpringBoot项目

目录 一.直接创建 二.修改Server URL为https://start.aliyun.com 一.直接创建 目前如果使用https://start.spring.io&#xff08;Spring官方源&#xff09;,已经没有办法直接创建JDK17一下的项目了&#xff1a; 如果想要创建JDK8的项目&#xff0c;可以先通…

人工智能-基础篇-13-基础应用篇-2~~模型项目开发流程--从0到1创建类似DeepSeek语言模型,应该怎么做?

1、前期准备 1、明确目标与需求分析 应用场景定义&#xff1a;首先需要明确你的模型将用于哪些场景&#xff0c;比如对话系统、文本生成、代码辅助等。性能指标设定&#xff1a;确定关键性能指标(KPI)&#xff0c;如准确率、响应时间、支持的语言种类等。 2、组建团队 机器…

本周沪铝想法

核心逻辑&#xff1a;低库存支撑与淡季需求疲软博弈&#xff0c;宏观情绪助推高位震荡 一、成本下移 VS 价格韧性​ 成本端与价格表现呈现出不同态势。成本端方面&#xff0c;氧化铝现货价格在本周持续下跌&#xff0c;山东地区均价降至 3090 元 / 吨&#xff0c;环比下降 1.…

【网络】SSL/TLS介绍

一、SSL/TLS 概述 SSL&#xff08;Secure Socket Layer&#xff09; &#xff1a; 最初由网景&#xff08;Netscape&#xff09;开发&#xff0c;用于在客户端和服务器之间建立安全的加密连接&#xff0c;防止数据被窃取或篡改。后来逐步演进&#xff0c;最终被 TLS 取代。 TL…

TLF35584

13、SPI串行外设接口 13.1 介绍 主要功能 SPI 总线是⼀种以全双工模式运行的同步串行数据链路。TLF35584 在从机模式下进行通信&#xff0c;其中主机(μC)启动数据帧。TLF35584应该通过专用片选线进行寻址。这允许其他从设备连接到SPI总线。 数据传输 开始通信&#xff0c;μ…

word中如何保存高清图片,并保存为高质量的pdf文件(图像不失真)

word中如何保存高清图片 打开word,选择&#xff0c;选项&#xff0c;高级选项&#xff0c;选择不压缩文件中的图像并保持分辨率高保真 将word保存为高质量的pdf文件 不用另存为或者导出 选择文件&#xff0c;选择打印&#xff1a; 选择中间都打印出pdf即可。 然后再选择打印…