滑动窗口最大值(力扣239)

news/2025/1/23 17:55:32/

刚拿到这道题,我们第一反应就是遍历每一个滑动窗口,然后在滑动窗口中遍历找到该窗口的最大值,但是这样的时间复杂度为O(k*n).有没有更简单的方法呢?答案是使用队列。更准确的说是双向队列。下面我将详细讲解一下如何使用双向队列解决这道问题。

在按照滑动窗口的大小遍历数组时,我们可以一边将数据存储到双向队列中,一边要及时弹出数据,保证队列中的数字一定是同一窗口且队列的首个元素一定是该窗口的最大值。那么该如何保证呢?在我们将滑动窗口的末端往后移动一位时,会有一个新窗口的末端数字进入窗口,如果这个末端数字比队列中某些已经存放的数大,那么队列中的这些数一定不可能成为新窗口的最大值,可以全部弹出。同时在滑动窗口移动过程中,我们也需要及时弹出元素,因为每当滑动窗口的起点往后移动一位,窗口起始数字就会移出窗口,自然其也要从队列弹出。但是这个起始数可能一开始就不存在于队列中,因为在将新窗口的末端数字存入队列时,需要通过比大小弹出一些元素,起始数字如果小于该末端数字,它就会被提前弹出。另外还有小的注意点,我写在代码注释中,代码如下:

class Solution {
private:class MyQueue{
public:deque<int> que;//按照文章中说的思路,自定义弹出操作与存入操作void pop(int value){if(que.front() == value){que.pop_front();}}void push(int value){while(!que.empty() && value > que.back()){//要移出的数不一定是第一个数,前面有数挡着,所以得从队列末尾出去,这就体现了双向队列的作用que.pop_back();}que.push_back(value);}int max(){return que.front();}
};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;//开始队列为空,所以我们要先存入第一个滑动窗口的所有数字//方便后续窗口移动过程中的弹出与存入for(int i = 0;i < k;i++){que.push(nums[i]);}result.push_back(que.max());//i用来遍历窗口末端位置,如果用来遍历起始位置,那么末端位置要用加法表示,这样数组访问时会越界for(int i = k;i <= nums.size() - 1;i++){que.pop(nums[i - k]);//用减法表示起始位置,不会数组越界que.push(nums[i]);result.push_back(que.max());}return result;}
};


http://www.ppmy.cn/news/1565547.html

相关文章

一个面向领域的直播平台开源!

面向教育等领域&#xff0c;二开后可以做视频会议等 在线直播平台 基于 Spring Boot 和 SRS 平台功能 视频直播 在线聊天 直播提醒 作业上传和批改 项目介绍了一个基于Spring Boot和SRS的在线直播平台&#xff0c;这个平台具备视频直播、在线聊天、直播提醒以及…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型

图: 说明: 进销存管理系统说明文档 功能模块 1. 首页 显示关键业务数据商品总数供应商总数本月采购金额本月销售金额显示预警信息库存不足预警待付款采购单待收款销售单2. 商品管理 商品信息维护商品编码(唯一标识)商品名称规格型号单位分类进货价销售价库存数量预警…

用 Java 发送 HTML 内容并带附件的电子邮件

实现思路 首先&#xff0c;设置邮件服务器的相关属性&#xff0c;包括是否需要认证、使用的邮件协议、服务器地址、端口等。 创建一个会话对象&#xff0c;使用 Session.getInstance 方法&#xff0c;并提供邮件服务器的属性和认证信息。 创建一个 MimeMessage 对象作为邮件消…

爬取NBA球员信息并可视化小白入门

网址:虎扑体育-NBA球员得分数据排行 第1页 步骤: 分析页面 确定URL地址模拟浏览器向服务器发送请求数据解析 提取想要的数据保存数据 爬虫所需要的模块 requests(发送HTTP请求)parsel(解析HTML内容)pandas(数据保存模块) 第一步分析页面 --确定是静态页面还是动态页面 右击点…

小白误入(需要一定的vue基础 )使用node建立服务器——vue前端登录注册页面连接到数据库

第一步&#xff1a;首先明确需要编写的文件&#xff1a; vue前端的登录页面&#xff1a;login.vue vue前端的注册页面&#xff1a;sign.vue vue前端的路由页面&#xff0c;负责vue框架内页面的跳转&#xff1a;index.js node后端连接数据&#xff0c;建立请求文件 &#xf…

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一&#xff1a; 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础&#xff0c;而矩阵运算则简洁地表示和…

Erlang语言的网络编程

Erlang语言的网络编程探索 引言 在现代网络应用开发中&#xff0c;高并发、可扩展性以及系统容错能力是至关重要的。这些需求促使开发者寻求一种能够有效应对这些挑战的编程语言。Erlang作为一种功能强大的编程语言&#xff0c;其在电信行业的成功应用为其在网络编程领域的使…