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

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

文章目录

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

单调栈

模板题

题目链接: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(); 就是维护单调队列单调性的核心代码

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

相关文章:

  • LabVIEW扫频阻抗测试系统
  • 回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测(含优化前后预测可视化)
  • vue 跨域XMLHttpRequest
  • 如何使用 WebRTC 与 Kurento 建立视频会议 App
  • 如何成为一个更好的沟通者?
  • 粒子群优化算法(Particle Swarm Optimization,PSO)求解基于移动边缘计算的任务卸载与资源调度优化(提供MATLAB代码)
  • navicat连接postgresql、人大金仓等数据库报错
  • 带libc源码gdb动态调试(导入glibc库使得可执行文件动态调试时可看见调用库函数源码)
  • 【Vue实用功能】Vue实现文档在线预览功能,在线预览PDF、Word等office文件
  • [MQ]常用的mq产品图形管理web界面或客户端
  • MySQL数据导入:MySQL 导入 Excel 文件.md
  • vue预览pdf文件的几种方法
  • 77.Go中interface{}判nil的正确姿势
  • Windows 10/11系统自带“录屏”功能的快捷键无效的解决之道
  • C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)
  • 【翻译】babel对TC39装饰器草案的实现
  • C++入门教程(10):for 语句
  • CSS 三角实现
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Lsb图片隐写
  • Protobuf3语言指南
  • Redis字符串类型内部编码剖析
  • SQLServer插入数据
  • uva 10370 Above Average
  • 从零开始在ubuntu上搭建node开发环境
  • 简析gRPC client 连接管理
  • 排序算法学习笔记
  • 全栈开发——Linux
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度学习入门:10门免费线上课程推荐
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • zabbix3.2监控linux磁盘IO
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​【已解决】npm install​卡主不动的情况
  • ​学习一下,什么是预包装食品?​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (定时器/计数器)中断系统(详解与使用)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转) ns2/nam与nam实现相关的文件
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • *2 echo、printf、mkdir命令的应用
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .apk文件,IIS不支持下载解决
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NetCore项目nginx发布
  • @requestBody写与不写的情况
  • @RequestBody与@ModelAttribute