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

LeetCode 239. Sliding Window Maximum 题解

LeetCode 239. Sliding Window Maximum 题解

题目描述

给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7

示例 2:

输入:nums = [1], k = 1 输出:[1]

示例 3:

输入:nums = [1,-1], k = 1 输出:[1,-1]

示例 4:

输入:nums = [9,11], k = 2 输出:[11]

示例 5:

输入:nums = [4,-2], k = 2 输出:[4]

解题思路

方法:单调队列

思路

  • 使用单调队列来存储窗口中的元素索引,队列中的元素对应的数值是递减的
  • 遍历数组,对于每个元素:
    • 当队列不为空且当前元素大于队列尾部元素对应的数值时,弹出队列尾部元素
    • 将当前元素的索引压入队列
    • 当队列头部元素的索引超出窗口范围时,弹出队列头部元素
    • 当遍历的元素索引大于等于 k-1 时,将队列头部元素对应的数值加入结果列表

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。每个元素最多被压入和弹出队列一次。
  • 空间复杂度:O(k),最坏情况下,队列需要存储 k 个元素。

代码实现

方法:单调队列

class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: # 初始化结果列表和单调队列 result = [] deque = [] n = len(nums) # 遍历数组 for i in range(n): # 当队列不为空且当前元素大于队列尾部元素对应的数值时,弹出队列尾部元素 while deque and nums[i] > nums[deque[-1]]: deque.pop() # 将当前元素的索引压入队列 deque.append(i) # 当队列头部元素的索引超出窗口范围时,弹出队列头部元素 while deque[0] <= i - k: deque.pop(0) # 当遍历的元素索引大于等于 k-1 时,将队列头部元素对应的数值加入结果列表 if i >= k - 1: result.append(nums[deque[0]]) return result

测试用例

测试用例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]

测试用例 2:

输入:nums = [1], k = 1
输出:[1]

测试用例 3:

输入:nums = [1,-1], k = 1
输出:[1,-1]

测试用例 4:

输入:nums = [9,11], k = 2
输出:[11]

测试用例 5:

输入:nums = [4,-2], k = 2
输出:[4]

总结

本题是单调队列的经典应用问题,主要考察对单调队列数据结构的理解和使用。通过使用单调队列,我们可以高效地找到滑动窗口中的最大值。

单调队列的核心思想是:使用队列来存储窗口中的元素索引,队列中的元素对应的数值是递减的,当遇到更大的元素时,弹出队列尾部的较小元素,当队列头部元素超出窗口范围时,弹出队列头部元素。

这种方法不仅适用于滑动窗口最大值问题,还可以应用于许多其他需要滑动窗口操作的问题。掌握单调队列的使用,对于解决这类问题非常重要。

http://www.jsqmd.com/news/652210/

相关文章:

  • FreeRTOS任务创建实战:如何避免Guru Meditation Error和队列断言失败
  • 容器镜像进阶:多阶段构建优化 + 镜像分层缓存策略 + 漏洞扫描自动化
  • STM32H7的SAI接口全双工配置避坑指南:从CubeMX到DMA双缓冲的完整流程
  • BilibiliDown终极指南:4种高效方案解决B站视频下载难题
  • 告别静态图表!用WPF LiveCharts 2.x 模拟实时数据监控面板(附完整MVVM源码)
  • 如何用AI自动化浏览器操作:5分钟掌握零代码的终极解决方案
  • 从AkShare源码中学到的5个Pandas高级技巧
  • 代码随想录 27(动态规划)
  • Notepad++最新版更新|安全修复+VS Code对比,免费开源编辑器首选(附批量处理技巧)
  • 保姆级教程:在VMware 16上用Ubuntu 18.04给Jetson TX2刷JetPack 4.6(含ARM/X86换源避坑)
  • C++面试突击:从new/delete到STL容器,这些高频考点你真的掌握了吗?
  • 实战复盘:基于涨乐财付通APP徒手写一个“双时间点”全市场行情盯盘系统
  • C语言共用体(联合体)的‘骚操作’:如何用union巧妙节省内存?附嵌入式开发实战代码
  • 前端安全防护实战指南
  • 低查重AI教材生成秘籍大公开!高效工具助力快速编写专业教材!
  • Pixel Language Portal 算法优化案例:卷积神经网络跨维特征提取
  • 手把手教你用Arduino和PulseSensor做个心率监测仪(附Processing上位机调试技巧)
  • MTX-PLGA-Fe₃O₄,氨甲蝶呤-PLGA-四氧化三铁纳米颗粒 ,化学特性
  • 告别枯燥理论!用 Proteus 8.15 + 51 汇编玩转硬件:5 个创意小项目源码全解析
  • FastAPI 容器化部署:编写高性能 Dockerfile 与 Uvicorn 生产配置
  • 360°全景拼接相机开发避坑指南:海思3403平台4目方案常见问题解析
  • MTX-PLGA-Fe₃O₄,米托蒽醌-PLGA-四氧化三铁纳米颗粒,反应原理
  • 别再纠结波特率了!用应广单片机实现自定义UART,搞定OTP调试数据传输
  • JDspyder:京东抢购自动化脚本终极指南,告别手动抢购烦恼
  • 别再只会adb install了!手把手教你用ADB搞定APK安装、权限修改与系统目录操作
  • Performance-Fish:基于零分配缓存架构与并行化优化实现4倍游戏性能提升的技术深度解析
  • 告别黑屏!树莓派外接显示器/电视的5个常见问题与解决方法(Raindrop工具详解)
  • FastAPI 与 GraphQL 融合:集成 Strawberry 实现灵活查询接口详解
  • Bilivideoinfo:高效精准的B站视频数据批量爬取实战指南
  • VMware Horizon 8连接测试后,别忘了检查这5个关键点(安全与性能优化指南)