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

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列(Monotonic Queue) 解决滑动窗口最大值问题的优化算法。我来简单解释一下:

核心思路

  1. 问题分析:在滑动窗口中,若存在两个下标 i < jnums[i] ≤ nums[j],则 nums[i] 永远不可能成为后续窗口的最大值(因为 j 会比 i 更晚离开窗口)。因此,可以提前淘汰 nums[i]

  2. 数据结构选择:使用双端队列(Deque)维护一个单调递减的下标序列,确保队列中元素对应的值从队首到队尾严格递减。

  3. 维护单调队列

    • 插入新元素:将新元素与队尾比较,若新元素更大,则不断弹出队尾,直到满足单调性。
    • 淘汰旧元素:检查队首元素是否已超出窗口范围,若超出则弹出队首。

算法步骤

  1. 初始化队列:遍历前 k 个元素,维护单调队列。
  2. 处理每个窗口
    • 淘汰旧元素:若队首下标超出窗口左边界,弹出队首。
    • 插入新元素:将当前元素下标加入队尾,弹出所有不大于当前值的队尾元素。
    • 记录最大值:队首元素对应的值即为当前窗口的最大值。
  3. 滑动窗口:重复步骤2,直到处理完所有窗口。

示例代码(C++)

#include <iostream>
#include <vector>
#include <deque>
using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n = nums.size();vector<int> result;if (n == 0 || k == 0) return result;deque<int> q; // 存储下标,对应的值单调递减// 初始化第一个窗口(前k个元素)for (int i = 0; i < k; ++i) {// 弹出所有比当前元素小的队尾下标(维护单调递减)while (!q.empty() && nums[i] >= nums[q.back()]) {q.pop_back();}q.push_back(i);}result.push_back(nums[q.front()]); // 第一个窗口的最大值// 滑动窗口处理后续元素for (int i = k; i < n; ++i) {// 淘汰已离开窗口的队首下标(左边界为i-k+1,下标<=i-k时淘汰)while (!q.empty() && q.front() <= i - k) {q.pop_front();}// 维护单调递减:弹出所有比当前元素小的队尾下标while (!q.empty() && nums[i] >= nums[q.back()]) {q.pop_back();}q.push_back(i);result.push_back(nums[q.front()]); // 当前窗口最大值}return result;
}// 测试示例
int main() {vector<int> nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;vector<int> res = maxSlidingWindow(nums, k);cout << "滑动窗口最大值:";for (int num : res) {cout << num << " ";}// 输出:3 3 5 5 6 7return 0;
}

复杂度分析

  • 时间复杂度:O(n),每个元素最多入队和出队一次。
  • 空间复杂度:O(k),队列中最多存储 k 个元素。

关键点

  • 单调队列:通过维护单调性,避免重复比较,将暴力算法的 O(nk) 优化到 O(n)。
  • 双端队列:支持 O(1) 时间复杂度的队首和队尾操作。
  • 应用场景:适用于求解滑动窗口最大值/最小值、子数组最大和等问题。

相关文章:

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列&#xff08;Monotonic Queue&#xff09; 解决滑动窗口最大值问题的优化算法。我来简单解释一下&#xff1a; 核心思路 问题分析&#xff1a;在滑动窗口中&#xff0c;若存在两个下标 i < j 且 nums[i] ≤ nums[j]&#xff0c;则 nums[i] 永远…...

仓颉开发语言入门教程:搭建开发环境

仓颉开发语言作为华为为鸿蒙系统自研的开发语言&#xff0c;虽然才发布不久&#xff0c;但是它承担着极其重要的历史使命。作为鸿蒙开发者&#xff0c;掌握仓颉开发语言将成为不可或缺的技能&#xff0c;今天我们从零开始&#xff0c;为大家分享仓颉语言的开发教程&#xff0c;…...

Axure中继器高保真交互原型的核心元件

Axure作为一款强大的原型设计工具&#xff0c;中继器无疑是打造高保真交互原型的核心利器。今天&#xff0c;就让我们深入探讨一下Axure中继器的核心地位、操作难点&#xff0c;以及如何借助优秀案例来提升我们的中继器使用技能。 一、核心地位 中继器在Axure中的地位举足轻重…...

【SpringBoot】✈️整合飞书群机器人发送消息

&#x1f4a5;&#x1f4a5;✈️✈️欢迎阅读本文章❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章阅读大约耗时3分钟。 ⛳️motto&#xff1a;不积跬步、无以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&am…...

第 1 章:数字 I/O 与串口通信(GPIO UART)

本章目标: 掌握 GPIO 的硬件原理、寄存器配置与典型驱动框架 深入理解 UART/USART 的帧格式、波特率配置、中断与 DMA 驱动 通过实战案例,将 GPIO 与 UART 结合,实现 AT 命令式外设控制 章节结构 GPIO 概述与硬件原理 GPIO 驱动实现:寄存器、中断与去抖 UART/USART 原理与帧…...

【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型

Wan2.1&#xff1a;下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器&#xff08;Wan-VAE&#xff09;2. 视频扩散 Transformer&#xff08;Video Diffusion DiT&#xff09;3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…...

java配置webSocket、前端使用uniapp连接

一、这个管理系统是基于若依框架&#xff0c;配置webSocKet的maven依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 二、配…...

interface接口和defer场景分析

接口 接口这里主要两点&#xff1a; 设计业务结构时采用依赖倒转&#xff1a;业务层向下依赖抽象层&#xff0c;实现层向上依赖抽象层。 相比于之前&#xff1a; 之后&#xff1a; 注意struct中嵌套interface和不嵌套interface的区别&#xff1a; type Myinterface interfac…...

02、基础入门-Spring生态圈

02、基础入门-Spring生态圈 # Spring生态圈概述 **Spring生态圈**是基于Spring框架的一系列开源项目和工具的集合&#xff0c;涵盖了各种领域&#xff0c;包括Web开发、数据访问、集成、测试、安全等。 ## 主要组成部分 1. **Spring Framework**&#xff1a;是整个生态圈的核心…...

前后端交互中的绝对路径和相对路径

前端 <form action"hello" method"post"> 1. 不加斜杠 &#xff08;相对路径&#xff0c;如 action"hello"&#xff09; 解析规则&#xff1a;基于当前页面的 URL 路径部分 进行拼接。 假设当前页面 URL 是 http://域名:端口/应用上下文…...

从零开始学习three.js(18):一文详解three.js中的着色器Shader

在WebGL和Three.js的3D图形渲染中&#xff0c;着色器&#xff08;Shader&#xff09; 是实现复杂视觉效果的核心工具。通过编写自定义的着色器代码&#xff0c;开发者可以直接操作GPU&#xff0c;实现从基础颜色渲染到动态光照、粒子效果等高级图形技术。本文将深入解析Three.j…...

调用百度云API机器翻译

新建Python文件&#xff0c;叫 text_translator.py 输入 import requests import jsonAPI_KEY "glYiYVF2dSc7EQ8n78VDRCpa" # 替换为自己的API Key SECRET_KEY "kUlhze8OQZ7xbVRp" # 替换为自己的Secret Keydef main():# 选择翻译方向while True:di…...

大模型训练计算显存占用

在大模型训练过程中&#xff0c;GPU显存中需要存储多种类型的数据&#xff0c;这些数据的合理管理直接影响训练效率和模型规模。需要放入GPU的关键数据类型如下&#xff1a; 注意&#xff1a; 在计算大模型训练占用的显存时&#xff0c;一般只计算 模型参数、梯度、优化器 的显…...

uni-app学习笔记六-vue3响应式基础

一.使用ref定义响应式变量 在组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff0c;ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回 示例代码&#xff1a; <template> <view>{{ num1 }}</view><vi…...

亚远景-ASPICE与ISO 21434在汽车电子系统开发中的应用案例

在汽车电子系统开发中&#xff0c;ASPICE&#xff08;Automotive Software Process Improvement and Capacity Determination&#xff09;与ISO 21434&#xff08;Road vehicles — Cybersecurity engineering&#xff09;是两个关键标准&#xff0c;分别从软件开发流程和网络安…...

『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle

📣读完这篇文章里你能收获到 🐍 了解 virtualenv 参数错误的原因及解决方案📦 学习如何正确配置 Python 虚拟环境文章目录 前言一、问题描述1.1 错误现象1.2 影响范围二、问题分析2.1 根本原因三、解决方案3.1 兼容处理3.2 完整解决方案四、总结前言 本文详细介绍了在 D…...

详细介绍一下Python连接MySQL数据库的完整步骤

以下是 Python 连接 MySQL 数据库的完整步骤&#xff0c;包含环境准备、连接建立、数据操作、错误处理和性能优化等内容&#xff1a; 一、环境准备 安装 MySQL 服务器 Windows/macOS&#xff1a;下载安装包 MySQL Installer Linux&#xff1a; bash Ubuntu/Debian sudo apt-…...

【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、InputSystem配置二、GameInput 游戏输入脚本1.实现思路2.完整代码三、Player 游戏人物移动脚本1.实现思路2.完整代码四、场景脚本设置1.组件设置五、问题解决1.人物一直下落2.人物跳跃时,…...

单片机-STM32部分:13-1、编码器

飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中&#xff0c;需要位置闭环的的产品&#xff0c;类似电机类产品来说&#xff0c;编码器至关重要&#xff0c;它不仅可以使我们对带年纪进行精确的速度闭环&#xff0c;位…...

机器学习第十二讲:特征选择 → 选最重要的考试科目做录取判断

机器学习第十二讲&#xff1a;特征选择 → 选最重要的考试科目做录取判断 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、学…...

关于我在使用stream().toList()遇到的问题

关于我在使用stream().toList()遇到的问题 问题描述 在测试以上程序的时候抛出了空指针异常 于是我以为是我数据库中存在null字段&#xff0c;但查看后发现并不存在为null的数据 问题排查 起初我以为问题出现在sort排序方法这&#xff0c;事实也确实是&#xff0c;当我把s…...

javascript 编程基础(2)javascript与Node.js

文章目录 一、Node.js 与 JavaScript1、基本概念1.1、JavaScript&#xff1a;动态脚本语言1.2、Node.js&#xff1a;JavaScript 运行时环境 2、核心区别3、执行环境差异3.1、浏览器中的JavaScript3.2、Node.js中的JavaScript 4、共同点5、为什么需要Node.js&#xff1f; 一、No…...

Spring Boot 集成 druid,实现 SQL 监控

文章目录 背景Druid 简介监控统计 StateFilter其它 Filter详细步骤第 1 步:添加依赖第 2 步:添加数据源配置【通用部分】第 3 步:添加监控配置【关键部分】第 3 步:访问 druid 页面参考背景 😂 在 Code Review 过程中发现,经常有开发会忘记给表加索引。这就导致,生产运…...

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量&#xff08;如单卡 24GB&#xff09;&#xff0c;Ollama 不会自动启用多卡 在run…...

HTML向四周扩散背景

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>扩散背景效果</title><style>body {…...

基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例

前言 随着移动互联网的飞速发展&#xff0c;基于位置的服务&#xff08;LBS&#xff09;需求日益增长&#xff0c;越来越多的应用需要从地图中检索特定区域内的地理信息&#xff0c;例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体&#xff0c;其周边的地理信息…...

使用 Terraform 创建 Azure Databricks

使用 Terraform 创建 Azure Databricks Terraform 是一种基础设施即代码(IaC)工具,允许用户通过声明式配置文件来管理和部署云资源。Azure Databricks 是一个基于 Apache Spark 的分析平台,专为数据工程和数据科学设计。通过 Terraform,可以自动化 Azure Databricks 的创…...

本地部署dify+ragflow+deepseek ,结合小模型实现故障预测,并结合本地知识库和大模型给出维修建议

1.准备工作 使用ollama 拉取deepseek-r1:7b 官网下载ollama ollama run deepseek-r1:7b ollama list Ragflow专注于构建基于检索增强生成&#xff08;RAG&#xff09;的工作流&#xff0c;强调模块化和轻量化&#xff0c;适合处理复杂文档格式和需要高精度检索的场景。Dify…...

SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!

SECERN AI提出的3D生成方法SVAD通过视频扩散生成合成训练数据&#xff0c;利用身份保留和图像恢复模块对其进行增强&#xff0c;并利用这些经过优化的数据来训练3DGS虚拟形象。SVAD在新的姿态和视角下保持身份一致性和精细细节方面优于现有最先进&#xff08;SOTA&#xff09;的…...

深入探索:Core Web Vitals 进阶优化与新兴指标

一、INP&#xff08;Interaction to Next Paint&#xff09;深度解析 INP 与 FID 的核心差异 • 响应范围&#xff1a;FID仅测量首次输入延迟&#xff0c;而INP跟踪页面生命周期中所有关键交互 • 测量维度&#xff1a;INP综合考虑输入延迟、处理时间和下一帧渲染时间 • 评…...