当前位置: 首页 > news >正文

2025-05-06 滑动窗口最大值

场景

在处理一些需要维护固定窗口大小的问题时,deque可以方便的实现窗口的滑动。尤其在处理滑动窗口内最大值最小值问题的时候,时间复杂度以及空间复杂度可以到O(n)

问题描述

给定一个数组 nums 和一个滑动窗口的大小 k,滑动窗口从数组的最左侧移动到最右侧,每次移动一个位置。要求找出每个滑动窗口内的最大值。

实现思路

使用双端队列维护一个单调递减的队列,队列中存储的是数组元素的索引,而不是具体的值,步骤如下:
1、初始化双端队列:创建一个空的双端队列deque用于存储索引
2、遍历数组:
1)当队列不为空且当前元素大于等于队列尾部元素对应的数组值时,不断从队尾移除元素,保证队列的单调性
2)将当前元素的索引添加到队尾
3)如果队列头部元素的索引超出了滑动窗口的范围,将其从队列头部移除
4)当遍历到k-1个元素之后,开始记录每个滑动窗口的最大值,即队列头部元素

代码

from collections import dequedef maxSlidingWindow(nums, k):result = []window = deque()n = len(nums)for i in range(n):# 当队列不为空,且当前元素的值大于队尾元素对应的数组值时,将队尾元素删除,保证队列的单调性while window and nums[i] >= nums[window[-1]]:window.pop()# 将当前元素的索引加入队尾window.append(i)# 如果队列头部元素的索引超出滑动窗口的范围,从队列中移除头部元素if window[0] <= i-k:window.popleft()# 遍历到k-1个元素之后,开始记录最大值if i >= k-1:result.append(nums[window[0]])return result
http://www.dtcms.com/a/174362.html

相关文章:

  • 逐次逼近式A/D转换器
  • 1、PLC控制面板 - /自动化与控制组件/plc-control-panel
  • AI-02a5a2.神经网络的学习
  • C# 实现PLC数据自动化定时采集与存储(无需界面,自动化运行)
  • 2021-10-31 C++求一个千位和十位数字之和为10,百位个位之积为12的四位数
  • 针对面试-redis篇
  • mybatis 的多表查询
  • 【SpringBoot3】idea找不到log符号
  • 开源与商业:图形化编程工具的博弈与共生
  • 2025年游戏行业DDoS攻防指南:智能防御体系构建与实战策略
  • transformer➕lstm训练回归模型
  • hybird接口
  • 从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能
  • TS 泛型
  • Springboot之maven依赖管理
  • 【Vue】组件自定义事件 TodoList 自定义事件数据传输
  • 第八章--图
  • 在 Ubuntu 下使用 ESP-IDF 通过串口烧录 ESP32
  • 【日撸 Java 三百行】Day 3(注释,基本if语句,函数调用)
  • C++编程语言:从高效系统开发到现代编程范式的演进之路
  • 对标研华ECU-461,搭载飞腾4核/8核国产处理器, 提供8网 8串B码对时 双显 无风扇的ARM通信管理平台
  • 优势演员-评论家A2C详解:python从零实现
  • Cyber Weekly #54
  • 小程序问题(记录版)
  • spring详解-循环依赖的解决
  • 如何通过代理 IP 实现异地直播推流
  • 荣耀A8互动娱乐组件部署实录(第1部分:服务端环境搭建)
  • Android开发-工程结构
  • HarmonyOS基本的应用的配置
  • 编程日志4.25