【算法与数据结构】239、LeetCode滑动窗口最大值

news/2024/5/20 20:00:48/文章来源:https://blog.csdn.net/qq_45765437/article/details/131675374

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:这道题我们如果用暴力破解法需要 O ( n ∗ k ) O(n*k) O(nk)的复杂度。思索再三,我们需要一个能够把最大值放在队头,整个队列单调递减的单调队列。每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。要注意两点:1、最大值必须在队头,这样我们才能用que.front()访问 2、队头的最大值元素必须在滑动窗口内部,否则就不是滑动窗口的最大值

  对于上面两个问题我们分别在pop和push中做这样的逻辑:1、如果队尾元素如果小于入队元素,就弹出队尾元素,直到入队元素大于等于队尾元素才插入入队元素 2、每次访问que.front()之前,都进行一次判断,如果队头的最大值和nums[i-k]进行对比,如果相等,说明这个最大值元素不在滑动窗口中(滑动窗口范围为i-k+1,…,i-1,i)
  程序如下

class MyQueue {	// 单调队列,递减
public:deque<int> que;		// deque为双向数组,这里用它当做单调队列的底层实现void pop(int value) {	if (!que.empty() && value == que.front())	// 如果元素相等则弹出,否则不做操作que.pop_front();}void push(int value) {	// 保证队头元素一定是最大的while (!que.empty() && value > que.back()) {	// 队尾元素如果小于入队元素,就弹出队尾元素que.pop_back();}que.push_back(value);	// 直到入队元素大于等于队尾元素,插入}int front() {return que.front();}
};class Solution {
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.front());for (int i = k; i < nums.size(); ++i) {que.pop(nums[i - k]);	// 弹出队头的元素,防止最大值一直在队头,且这个最大值又不在滑动窗口中的情况que.push(nums[i]);result.push_back(que.front());}return result;}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),所有元素的push和pop操作都只进行一次。
  • 空间复杂度: O ( k ) O(k) O(k),需要一个大小为k的单调队列额外空间。

三、完整代码

# include <iostream>
# include <vector>
# include <deque>
using namespace std;class MyQueue {	// 单调队列,递减
public:deque<int> que;		// deque为双向数组,这里用它当做单调队列的底层实现void pop(int value) {	if (!que.empty() && value == que.front())	// 如果元素相等则弹出,否则不做操作que.pop_front();}void push(int value) {	// 保证队头元素一定是最大的while (!que.empty() && value > que.back()) {	// 队尾元素如果小于入队元素,就弹出队尾元素que.pop_back();}que.push_back(value);	// 直到入队元素大于等于队尾元素,插入}int front() {return que.front();}
};class Solution {
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.front());for (int i = k; i < nums.size(); ++i) {que.pop(nums[i - k]);	// 弹出队头的元素,防止最大值一直在队头,且这个最大值又不在滑动窗口中的情况que.push(nums[i]);result.push_back(que.front());}return result;}
};void my_print(vector <int>& v, string msg)
{cout << msg << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << "  ";}cout << endl;
}void VectorGenerator(int* arr, vector<int>& v, int arr_len) {for (int i = 0; i < arr_len; ++i) {v.push_back(arr[i]);}
}int main()
{int window_size = 3;int arr[] = {1, 3, -1, -3, 5, 3, 6, 7};int arr_len = sizeof(arr) / sizeof(int);vector<int> nums;VectorGenerator(arr, nums, arr_len);my_print(nums, "目标数组");Solution s1;vector<int> result = s1.maxSlidingWindow(nums, window_size);my_print(result, "滑动窗口最大值");system("pause");return 0;
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_330210.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【新版系统架构】第十九章-大数据架构设计理论与实践

大数据处理系统架构 大数据处理系统面临挑战 如何利用信息技术等手段处理非结构化和半结构化数据如何探索大数据复杂性、不确定性特征描述的刻画方法及大数据的系统建模数据异构性与决策异构性的关系对大数据知识发现与管理决策的影响 大数据处理系统架构特征 鲁棒性和容错…

【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求&#xff1a;

危机现场 | 如果给你25万美元,你会登上泰坦号吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 这是我们更名为记者下班后的第一期节目&#xff0c;临时把危机现场&#xff08;原为死神来了&#xff09…

音视频编码实战-------pcm+yuv数据转成MP4

文章目录 1.编码流程图2.相关模块及函数2.1 编码器相关API2.2 复用器相关API2.3 重采样相关API注意点 简单的编码流程相关代码 1.编码流程图 2.相关模块及函数 2.1 编码器相关API avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avc…

【Arduino小车实践】PID应用之四驱小车

一、 PID公式 二、 PID应用的必要性 1. 四驱小车运动 左边两个驱动轮和右边两个驱动轮的速度相同直线右边轮子的速度大于左边轮子的速度左偏右边轮子的速度小于左边轮子的速度 右偏 2. 产生多种运动的原因 小车的4个电机&#xff0c;减速箱以及车轮在物理层面上存在误差&am…

【文章系列解读】Nerf

1. Nerf NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 2020年8月3日 &#xff08;0&#xff09;总结 NeRF工作的过程可以分成两部分&#xff1a;三维重建和渲染。&#xff08;1&#xff09;三维重建部分本质上是一个2D到3D的建模过程&#xff…

两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】

文章目录 两种传输层协议TCP和UDPTCP与UDP区分UDP的特点及其目的TCP的特点及其目的 两种传输层协议TCP和UDP 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP。 ■ TCP TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构&#xff0c;你可以把它想象成排…

排序算法笔记-归并排序

归并排序 简介 通过找到中间值&#xff0c;然后递归分别从左区间和右区间找中间值&#xff0c;最终将所给的值划分为单个块&#xff0c;然后进行一步一步回溯&#xff0c;分块由两个单个分区排序后合成一个&#xff0c;以此类推&#xff0c;最后实现有序排序 时间复杂度 最…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网&#xff1f;网关地址是谁定的&#xff0c;是配置路由的人随意定的吗&#xff1f;&#xff08;配置人员定的&#xff09;如何正确设置网关地址&#xff08;路…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下&#xff1a; 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…

无法将“pip“识别为cmdlet、函数、脚本文件或可运行程序的名称。

出现问题如下&#xff1a; 出现问题原因&#xff1a; 没有添加pip对应的安装目录进入环境变量里面的系统变量。 解决方案&#xff1a; 1.确定python的安装路径 将python的路径添加到系统变量中 2.输入pip所在的安装路径&#xff1a; python路径\Lib\site-packages 3.添加…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

程序员,到美国!赚美元!!!

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它的官方客户端提供了多种编程语言的接口&#xff0c;包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Orange pi3初调试

因为树莓派沦为理财产品1年前出手殆尽后&#xff0c;现在唯一一个B性能不足一直没动力调试&#xff0c;沦为吃灰工具。 偶然之间多多给推了个orange产品预售&#xff0c;看了下pi3的参数&#xff0c;这不和赚了差价的3B一个性能吗&#xff1f;果断定了个预售款&#xff0c;在差…

2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】

&#x1f388;前言 为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新的内容&#xff0c;并对之前的版本中有些模糊的地方进行了纠正。此篇文章为Unity所有面试题模块的目录导航文章&#xff0c;全网最全的 Unity 面试题 都在这里了…

反转链表 (反转整个链表+反转部分链表)

简单问题&#xff1a;反转整个链表 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 解题思路&#xff1a; 1.因为反转后链表的末尾节点是原链表的头节点&#xff0c;所以一开始将头节点的后驱保存起来&#xff1b; 2.将头节…

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击&#xff08;半连接攻击&#xff09; --- syn攻击 &#xff08;1&#xff09;定义&#xff1a; sys 攻击数据是DOS攻击的一种&#xff0c;利用TCP协议缺陷&#xff0c;发送大量的半连接请求&#xff0c;耗费CPU和内存资源&#xff0c;发生在TCP三次握手中。 A向B…

计算机视觉的图像标注与视觉任务

1 ​计算机视觉应用 计算机视觉是一种利用计算机和数学算法来模拟人类视觉的技术&#xff0c;可以应用于许多领域。以下是计算机视觉的八大应用&#xff1a; 图像识别&#xff1a;利用计算机视觉技术&#xff0c;可以对图像进行分类、识别和分割&#xff0c;从而实现自动化的…

AI + 电力、大模型主题师资培训落地,飞桨持续赋能AI人才培养

随着数字浪潮袭来&#xff0c;人工智能的发展声势浩大&#xff0c;高校人工智能专业建设以及AI的人才培养已经提上日程。如何夯实产教融合&#xff0c;加快人工智能研究创新&#xff0c;培养具备AI系统能力和电力行业知识的拔尖人才&#xff0c;是推进电力产业智能化升级的迫切…