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

LeetCode 239 滑动窗口最大值

LeetCode 239 滑动窗口最大值

问题描述

给定一个整数数组 nums 和一个整数 k,定义一个大小为 k 的滑动窗口,该窗口从数组的最左侧移动到最右侧。你可以看到在滑动窗口内的 k 个数字,并返回滑动窗口中的最大值。

解题思路

我们可以利用一个双端队列 deque 来解决这个问题。在滑动窗口的过程中,我们需要做以下几件事情:

  1. 维护一个双端队列 deque,用来存储数组元素的索引。
  2. 当新的元素进入滑动窗口时,我们需要从队列的尾部开始比较,将小于等于当前元素值的索引全部弹出,确保队列中的元素是按照递减顺序排列的。
  3. 将当前元素的索引入队。
  4. 判断队列中的头部元素(即最大值的索引)是否已经超出滑动窗口的范围,若超出范围则将其弹出。
  5. 滑动窗口移动到达有效位置后,将队列头部元素对应的数组值添加到结果中。

代码实现

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> dq = {};vector<int> result = {};for (int i = 0; i < nums.size(); i++) {// 插入数值while (!dq.empty() && nums[dq.back()] <= nums[i]) {dq.pop_back();}dq.push_back(i);    // 入队// 滑动窗口右移if (i - dq.front() >= k) {    // 队首已经离开窗口了dq.pop_front();}// 记录答案if (i >= k - 1) {// 由于队首到队尾单调递减,所以窗口最大值就是队首result.push_back(nums[dq.front()]);}}return result;}
};

算法复杂度分析

  • 时间复杂度:该算法只需一次遍历数组,时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是数组的长度。
  • 空间复杂度:双端队列的最大空间为 O ( k ) O(k) O(k),用于存储滑动窗口的索引值。

总结

本文介绍了一种使用双端队列来解决滑动窗口最大值的问题的方法。通过维护一个单调递减的双端队列,可以在 O ( n ) O(n) O(n) 的时间复杂度内解决该问题,其中 n n n 是数组的长度。这种方法在面对滑动窗口问题时具有较高的效率和可读性,是一种常见的解题思路。

http://www.lryc.cn/news/308048.html

相关文章:

  • Vue单文件组件(SFC)规范
  • 简单版 git快速上手使用 clone项目 新建/切换分支 提交修改
  • 本届挑战赛季军方案:基于图网络及LLM AGENT的微服务系统异常检测和根因定位方法
  • 【MySQL】_内连接
  • ElasticSearch之跨集群搜索cross cluster search
  • 06|Mysql内部组件结构
  • 文件的写出操作
  • 使用gitlab搭建npm的依赖库,并在项目中使用
  • 如何让电脑待机而wifi不关的操作方法!!
  • 如何在Spring Boot应用中进行文件预览?
  • 阿里云4核16G服务器多少钱?幻兽帕鲁配置报价
  • el-autocomplete 提示文字出不来?修改支持模糊搜索提示
  • CentOS8 同步时间chrony ntpdate已无法使用
  • NFS服务器挂载失败问题
  • (Linux学习二)文件管理基础操作命令笔记
  • Docker本地部署GPT聊天机器人并实现公网远程访问
  • html2canvas + JsPDF.js 导出pdf分页时的问题
  • Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器
  • 从Spring Boot应用上下文获取Bean定义及理解其来源
  • 如何处理网络攻击对系统造成的损害?
  • 数字IC后端设计利器 - 《Innovus的基本使用流程和命令》(附下载)
  • Blender中四种不同的几何体类型(网格、曲线、体积和实例 )
  • Vue3 学习笔记(Day5)
  • 【网络编程】实现服务器端和客户端的通讯的简单程序
  • 如何在Portainer中部署Nginx容器并制作一个本地站点结合cpolar发布至公网可访问
  • Mysql的储存引擎
  • 【查漏补缺你的Vue基础】Vue数据监听深度解析
  • 大语言模型LLM发展历程中的里程碑项目:国内外技术革新重塑自然语言处理(LLM系列02)
  • JS二进制文件转换:File、Blob、Base64、ArrayBuffer
  • 编译opencv gpu版的条件