【基础算法练习】单调队列与单调栈模板

文章目录

  • 单调栈
    • 模板题
    • 代码模板
    • 算法思想
  • 单调队列
    • 模板题
    • 代码模板
    • 算法思想

单调栈

模板题

题目链接:ACwing 830. 单调栈

代码模板

#include <iostream>
#include <vector>
#include <stack>using namespace std;const int N = 100010;vector<int> v(N);int main()
{int n;cin >> n;stack<int> st;for (int i = 0; i < n; i++) cin >> v[i];for (int i = 0; i < n; i++) {// v[i] 是当前在遍历的数, v[i] 比栈里的数小就 pop, 直到在栈里找到比他大的数while (!st.empty() && st.top() >= v[i]) st.pop();  if (!st.empty()) cout << st.top() << " ";else cout << -1 << ' ';st.push(v[i]);}return 0;
}

算法思想

单调栈的核心就是根据题目的要求维护一个具有单调性的栈,核心代码:while (!st.empty() && st.top() >= v[i]) st.pop(); 通过这一段代码,在下一个数入栈之前,将不符合题目要求的单调性的栈元素全部出栈,从而做到每次入栈都能保持单调栈的单调性

这就是单调栈的核心的算法思想

单调队列

模板题

题目链接:154. 滑动窗口

代码模板

#include <iostream>
#include <vector>
#include <deque>
using namespace std;const int N = 1000010;vector<int> v(N);deque<int> q;int main()
{int n, k;cin >> n >> k;for (int i = 0; i < n; i++) cin >> v[i];for (int i = 0; i < n; i++) { // 求最小值while (q.size() > 0 && q.back() > v[i]) q.pop_back(); // 比下一个数大的数全部都出队q.push_back(v[i]); // 入队if (i - k >= 0 && q.front() == v[i - k]) q.pop_front(); // 如果这个数在窗口到期了, 就出队if (i >= k - 1) cout << q.front() << " ";}q.clear();cout << endl;for (int i = 0; i < n; i++) { // 求最大值while (q.size() > 0 && q.back() < v[i]) q.pop_back(); // 比下一个数小的数全部都出队q.push_back(v[i]); // 入队if (i - k >= 0 && q.front() == v[i - k]) q.pop_front(); // 如果这个数在窗口到期了, 就出队if (i >= k - 1) cout << q.front() << " ";}return 0;
}

算法思想

单调队列和单调栈的算法思想类似,不过在具体的实现和应用场景上略有不同,单调队列常用于滑动窗口的场景

这里我使用的是双端队列 deque 来模拟(用数组模拟也是一样的),这段:while (q.size() > 0 && q.back() < v[i]) q.pop_back(); 就是维护单调队列单调性的核心代码

除此之外,在滑动窗口的场景下,单调队列还需要维护滑动窗口的大小,以贴合题目的要求

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

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

相关文章

STM32标准库+HAL库 | 输入捕获测量PWM的脉冲频率+占空比

提醒&#xff1a;本文的代码Demo中使用的是&#xff0c;单通道捕捉采集PWM输入信号的频率占空比。 在上一篇博客中已经讲解了过PWM输出配置&#xff0c;本文主要讲解TIM输入捕获配置。STM32标准库HAL库 | 高精度动态调节PWM输出频率占空比_hal库改变pwm频率-CSDN博客 目录 1…

Mac安装配置maven

Mac安装配置maven 官网下载地址&#xff1a;https://maven.apache.org/download.cgi 下载好以后解压配置 maven 环境变量 打开终端&#xff0c;输入命令打开配置文件./bash_profile open ~/.bash_profile输入i进入编辑模式,进行maven配置; MAVEN_HOME为maven的本地路径 ex…

机器学习3-简单线性回归

需求&#xff1a; 现在要根据学生的学习时间来预测学习成绩&#xff0c;给出现有数据&#xff0c;用来训练模型并预测新数据。 分析&#xff1a; 使用线性回归模型。 代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection i…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到&#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册&#xff0c;我只截出重点部分 总结&#xff1a;数据在上升沿写出&#xff0c;下降沿读入&#xff0c;…

PDF控件Spire.PDF for .NET【安全】演示:使用 C# 检测签名的 PDF 是否被修改

对 PDF 文档进行数字签名后&#xff0c;PDF 将被锁定以防止更改或允许检测更改。在本文中&#xff0c;我们将介绍如何使用 Spire.PDF 检测签名的 PDF 是否被修改。 Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire…

鸿蒙首批原生应用!无感验证已完美适配鸿蒙系统

顶象无感验证已成功适配鸿蒙系统&#xff0c;成为首批鸿蒙原生应用&#xff0c;助力鸿蒙生态的快速发展。 作为全场景分布式操作系统&#xff0c;鸿蒙系统旨在打破不同设备之间的界限&#xff0c;实现极速发现、极速连接、硬件互助、资源共享。迄今生态设备数已突破8亿台&…

结构体与共用体基础

结构体基础用法与共用体简述 1.结构体的定义2.结构体声明及使用3.结构体成员初始化4.结构体占用空间探究4.1 结构体成员所在地址4.2 按地址值访问结构体内容4.3 内存对齐 5.共用体6.总结 1.结构体的定义 之前的课程中&#xff0c;我们介绍了很多数据类型&#xff0c;如整形、浮…

测试用例级别该如何定义 ? 在工作中该如何应用它 ? 把握好这5个场景即可。

1.级别的作用 在编写测试用例的过程中&#xff0c;用例的级别经常是一个不可缺少的字段 &#xff0c;本篇幅就来聊下这个字段 &#xff0c;首先从它的作用是什么呢 &#xff1f;我觉得主要有两点 &#xff0c;分别是 &#xff1a; 用于测试用例不同套件的选取 &#xff0c;即用…

MMCLMC公差计算.exe

一、概要 软件及完整代码请戳这里&#xff1a;MMC&LMC公差计算软件及代码 图1 软件操作界面 本软件功能主要是根据实际应用选择MMR或者LMR原则&#xff0c;输入基本尺寸、形位公差尺寸和实际测量尺寸&#xff0c;即可计算出对应的公差值。以孔的MMR为例见如图2、3&#xf…

Java - JDBC

Java - JDBC 文章目录 Java - JDBC引言JDBC1 什么是JDBC2 MySQL数据库驱动3 JDBC开发步骤4 具体介绍 引言 思考: 当下我们如何操作数据库&#xff1f; 使用客户端工具访问数据库&#xff0c;手工建立连接&#xff0c;输入用户名和密码登录。编写SQL语句&#xff0c;点击执行…

【论文阅读|半监督小苹果检测方法S3AD】

论文题目 &#xff1a; : Semi-supervised Small Apple Detection in Orchard Environments 项目链接&#xff1a;https://www.inf.uni-hamburg.de/en/inst/ab/cv/people/wilms/mad.html 摘要&#xff08;Abstract&#xff09; 农作物检测是自动估产或水果采摘等精准农业应用不…

GitCode|部分项目开源代码

1.EasyKeyboard 基于MFC的简单软键盘&#xff0c;使用vs2017开发 PangCoder / EasyKeyboard GitCode基于Windows平台的软键盘&#xff0c;使用VS2017开发&#xff0c;使用MFC框架https://gitcode.net/qq_36251561/easykeyboard 2.EncoderSimulator 基于WPF应用的编码器模拟工…