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

Leetcode刷题记录22——滑动窗口最大值

题源:https://leetcode.cn/problems/sliding-window-maximum/description/?envType=study-plan-v2&envId=top-100-liked

题目描述:
在这里插入图片描述

思路一:
暴力遍历法,通过一个长度为k的滑动窗口遍历nums,将其中最大的数依次记录下来,返回即可,代码如下:

class Solution(object):def maxSlidingWindow(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""max_num = []for i in range(len(nums) - k + 1):max_num.append(max(nums[i:i+k]))return max_num

不用想肯定超时了,困难题怎么会这么简单呢:
在这里插入图片描述
测试一下时间,确实太长了:
在这里插入图片描述

思路二:
使用双端队列:

步骤 1: 初始化队列

  • 初始时,将前 k 个元素依次加入队列。
  • 加入规则:如果队列末尾的元素小于当前元素,则移除末尾元素,直到队列为空或遇到更大的元素。然后将当前元素的索引加入队列。

例子:
初始窗口 [1,3,-1] 的处理:

  • 队列为空 → 加入 0(对应 1)。
  • 3 > 1 → 移除 0,加入 1(对应 3)。
  • -1 < 3 → 直接加入 2(对应 -1)。
    此时队列是 [1,2],对应的值为 [3,-1],队头是 3。

步骤 2: 处理后续元素
从第 k 个元素开始,每次窗口滑动一位:

  • 移除超出窗口范围的旧元素:
    如果队列头部的索引已经不在当前窗口范围内(即 <= i - k),则将其弹出。
  • 维护单调队列:
    将当前元素 nums[i] 加入队列时,同样遵循规则:移除所有比它小的元素索引,然后将当前索引加入队列。
  • 记录当前窗口的最大值:
    当窗口形成后(即 i >= k-1),队列头部的索引对应的值就是当前窗口的最大值。

例子:
继续处理 nums[3] = -3(窗口 [3,-1,-3]):

  • 窗口起始位置是 i - k + 1 = 1,检查队列头部的 1(对应 3)是否在窗口内(1 >= 1 ,不需要移除)。
  • nums[3] = -3 小于队列末尾的 -1(索引 2),直接加入队列。
    此时队列是 [1,2,3],对应值为 [3,-1,-3],最大值是 3。

代码实现如下:

class Solution(object):def maxSlidingWindow(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""  result = []              # 存储最终结果q = deque()              # 双端队列,存储索引for i in range(len(nums)):# Step 1: 移除超出窗口范围的索引while q and q[0] <= i - k:q.popleft()# Step 2: 维护单调队列(移除比当前元素小的索引)while q and nums[q[-1]] < nums[i]:q.pop()# Step 3: 添加当前索引q.append(i)# Step 4: 当窗口形成后,记录最大值if i >= k - 1:result.append(nums[q[0]])return result

执行用时如下:
在这里插入图片描述

http://www.dtcms.com/a/164088.html

相关文章:

  • AI Agent Protocols:现状、挑战与未来展望
  • 耐高低温抗金属RFID标签种类和应用场景
  • 【全国产化】基于飞腾 FT2000+/64 核的服务器主板设计与实践
  • LVGL -窗口操作
  • 【MCP Node.js SDK 全栈进阶指南】高级篇(3):MCP 安全体系建设
  • Unity-Shader详解-其三
  • 前端防护利器:disable-devtool 使用指南 - 保护你的Web应用安全
  • 本地知识库工具FASTGPT的安装与搭建
  • Java中final关键字的作用?
  • 信息学奥赛一本通 1454:山峰和山谷
  • 优化PCB Via Stub系列(1):一次学会利用层叠设计降低Via Stub损耗
  • MySQL数据库全面详解:从基础到高级应用
  • ref 和$refs
  • 已知条件概率,反推设计值
  • 爱普生SG2520HHN晶振数据中心服务器的理想解决方案
  • 【Luogu】动态规划七
  • 推荐系统在线离线打分不一致:核心原因与全链路解决方案
  • fastapi和flaskapi有什么区别
  • 1.5 城镇道路工程安全质量控制
  • 在Java中基于Geotools对PostGIS数据库的空间查询实践
  • 探索无人机模拟环境的多元景象及AI拓展
  • RPC复习
  • 大模型高效化三大核心技术:量化、蒸馏与剪枝详解
  • 免布线视频桩与催缴系统:智慧停车管理的创新实践
  • Dify:让AI应用开发变得简单又高效
  • 塑料材料工程师简历模板
  • 2025年具身智能科技研报
  • 从零开始:Android Studio开发购物车(第二个实战项目)
  • 三轴云台之镜头解码技术篇
  • Laravel基础