当前位置: 首页 > 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

相关文章:

  • 逐次逼近式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++编程语言:从高效系统开发到现代编程范式的演进之路
  • 巴基斯坦宣布关闭全国空域48小时
  • 人民日报评论:莫让“胖东来们”陷入“棒杀”“捧杀”泥潭
  • 世界银行最新营商环境体检单:59个测评点,上海22项达全球最优水平
  • 老人刷老年卡乘车被要求站着?公交公司致歉:涉事司机停职
  • 上海模速空间“北斗七星”与“群星”生态布局,正在做些什么?
  • 体坛联播|米兰逆转热那亚豪取3连胜,阿诺德官宣离开利物浦