算法基础——单调栈,单调队列

目录

1.单调栈

例题:【模板】单调栈

例题:求和  

2.单调队列

 例题:滑动窗口


1.单调栈

例题:【模板】单调栈

可以想象出一个柱状图,值越大,这个柱子越高

以此题的样例为例:

第一个数为7,想象一个高度为7的柱子,它的左边没有任何数,所以直接输出-1

然后第二个数为8,想象高度为8的柱子从右往左靠近7,因为7比8小,所以输出7

第三个数为5,5从右往左靠近8,而5比8小,所以8被删除,7大于5,所以7也被删除

此时5左边就没数了,输出-1

第四个数为6大于5,所以输出5

第五个数为7大于6,所以输出6

用栈的方法 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 10;

int a[N],l[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	stack<int> stk;
	int n;
	cin >> n;
	
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	for(int i = 1; i <= n; i++)
	{
		while(stk.size() && stk.top() >= a[i]) stk.pop();
		
		if(stk.empty()) l[i] = -1;
		else l[i] = stk.top();
		
		stk.push(a[i]);
	}
	
	for(int i = 1; i <= n; i++)
		cout << l[i] << ' ';
	return 0;
}

例题:求和  

这题要对一个数的左边和右边都进行单调栈求比它小的值

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;

ll a[N],l[N],r[N];
int stk[N];
int top;//表示栈中元素个数

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	for(int i = 1; i <= n; i++)
	{
		while(top && a[i] <= a[stk[top]]) top--;
		
		if(top != 0) l[i] = stk[top];
		else l[i] = 0;
		
		stk[++top] = i;
	}
	
	top = 0;//清空栈
	
	for(int i = n; i >= 1; i--)
	{
		while(top && a[i] < a[stk[top]]) top--;
		
		if(top != 0) r[i] = stk[top];
		else r[i] = n + 1;
		
		stk[++top] = i;
	}
	
	ll ans = 0;
	for(int i = 1; i <= n; i++) ans += a[i] * (r[i] - i) * (i - l[i]);
	cout << ans;
	return 0;
}

2.单调队列

 例题:滑动窗口

以求窗口内最大值为例,想象一个双端队列,从右边入队,每次入队与原来的队列中的最右边的元素比较大小,如果它的数值更大,那么就从右边pop掉原来队列中最右端的那个数,直到最左边的元素最大为止

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 10;

int a[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,k;
	cin >> n >> k;
	
	for(int i = 1; i <= n; i++) cin >> a[i];
	deque<int> dq;
	
	//求最大值
	for(int i = 1; i <= n; i++)
	{
		while(dq.size() && k <= i - dq.front()) dq.pop_front();
		
		while(dq.size() && a[dq.back()] <= a[i]) dq.pop_back();
		
		dq.push_back(i);
		
		if(i >= k) cout << a[dq.front()] << ' ';
	}
	
	dq.clear();
	cout << endl;
	
	//求最小值
	for(int i = 1; i <= n; i++)
	{
		//区间合法
		while(dq.size() && k <= i - dq.front()) dq.pop_front();
		
		while(dq.size() && a[dq.back()] >= a[i]) dq.pop_back();
		
		dq.push_back(i);
		
		if(i >= k)cout << a[dq.front()] << ' ';
	}
	return 0;
}

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

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

相关文章

【Java程序员面试专栏 分布式中间件】ElasticSearch 核心面试指引

关于ElasticSearch 部分的核心知识进行一网打尽,包括ElasticSearch 的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 从数据分类入手,考察全文索引的基本概念 现实世界中数据有哪…

yolov5配置教程

yolov5 yolov5 notepad notepad 直接下一步就可以 Git Git 取消勾选 修改默认编辑器为npp 其他都直接下一步 python3.8.1 python3.8.1 主要勾选添加环境变量 其他下一步即可 Miniconda Miniconda 其他下一步 然后添加系统环境变量 Pycharm Pycharm 把这个界面所…

MPLAB V8.92 printf

Compile error “A heap is required, but has not been specified” Set printf function #if 0 //for UART1 int fputc(int ch, FILE *f) { IFS1bits.U2TXIF 0; // if (runConfig.printOn 1) { // usart_data_transmit(USART0, (uint8_t)ch); U2TXREG ch; // while (RESE…

linux(阿里云)安装pytorch

目录 环境 安装步骤 1 检查python3和pip3是否已经安装 2 安装pytorch 3 安装完毕&#xff0c;检查pytorch版本 环境 阿里云 ubuntu 22.04 UEFI版 64位 安装步骤 1 检查python3和pip3是否已经安装 输入下面两条指令&#xff1a; python3 --version pip --version 检…

Nvm安装(windows版)

1、nvm 是什么 &#xff08;1&#xff09;nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 &#xff08;2&#xff09;有时候&#xff0c;我们可能同时在进行多个项目开发&#xff0c;而多个项…

书生·浦语大模型第六课作业

面向GPU的环境安装 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 数据准备 # 解压评测数据集到 data/ 处 cp /shar…

神经网络 | CNN 与 RNN——深度学习主力军

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要将卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;这两个深度学习主力军进行对比。我们知道&#xff0c;从应用方面上来看&#xff0c;CNN 用于图像识别较多&#xff0c;而 RNN 用于…

c++阶梯之类与对象(下)

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;&#xff1c; 续集 &#xff1e;-CSDN博客 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&a…

Go教程-什么是编程?

什么是编程&#xff0c;这是个有趣的话题。 编程是什么 编程&#xff0c;字面意思即编写程序&#xff0c;即通过既定的关键字&#xff0c;来描述你的想法&#xff0c;并让计算机的各个部件按照你的想法来做事。 这里计算机的各个部件通常来说&#xff0c;指的是CPU和IO设备。…

对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

linux系统配置zabbix监控agent端

目录 客户端配置 启动服务 浏览器工具设置 创建主机群组 创建主机 创建监控项 ​编辑 ​编辑 创建触发器 查看监控 客户端配置 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # yum clean allyum install -y zab…

【python之美】减少人工成本之批量拿取文件名保存_4

获取文件名保存 准备工作: 上代码: import ospath "C:\\Users\\Administrator\\Desktop\\text\\" file_names os.listdir(path) print(file_names)i 1 for file_name in file_names:name file_name.split(_)[0]print(name)new_name name "_修改后第&qu…

配置Juniper虚墙vSRX基于策略的IPsec VPN(WEB方式)

正文共&#xff1a;1444 字 18 图&#xff0c;预估阅读时间&#xff1a;2 分钟 关于IPsec VPN&#xff0c;我们已经有一个合集了&#xff08;IPsec VPN&#xff09;。之前接触比较多的是H3C的IPsec VPN&#xff0c;后来接触的厂家多了&#xff0c;才发现大家的模型或者叫法还是…

相机图像质量研究(20)常见问题总结:CMOS期间对成像的影响--全局快门/卷帘快门

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

C++:stack queue - 容器适配器

C&#xff1a;容器适配器 容器适配器概念stackqueuedeque 容器适配器概念 容器适配器是在C标准库中提供的一种容器的封装。它们提供了一种统一的接口&#xff0c;使得不同类型的容器可以以相似的方式被使用。容器适配器有三种类型&#xff1a;栈&#xff08;stack&#xff09;…

人形机器人专题:准直驱执行器深度:人形机器人执行器技术的前沿

今天分享的是人形机器人系列深度研究报告&#xff1a;《人形机器人专题&#xff1a;准直驱执行器深度&#xff1a;人形机器人执行器技术的前沿》。 &#xff08;报告出品方&#xff1a;招商证券&#xff09; 报告共计&#xff1a;34页 准直驱执行器具备独特优势 刚性执行器…

Netty Review - 服务端channel注册流程源码解析

文章目录 PreNetty主从Reactor线程模型服务端channel注册流程源码解读入口 serverBootstrap.bind(port)执行队列中的任务 &#xff1a; AbstractUnsafe#register0注册 doRegister() 源码流程图 Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketCh…

【机器学习案例4】为机器学习算法编码分类数据【含源码】

目录 编码分类数据 序数编码 标签编码 一次性编码 目标编码 目标编码的优点 目标编码的缺点 在现实生活中,收集的原始数据很少采用我们可以直接用于机器学习模型的格式,即数值型数据。因此,需要进行一些预处理,以便以正确的格式呈现数据、选择信息丰富的数据或降低其…

C++ 特殊类的实现

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 在C98中&#xff1a;将拷贝构造函数与赋值运算符重载…

2024-2-14-复习作业

1> 要求&#xff1a; 源代码&#xff1a; #include<stdio.h> #define N 50 int main(int argc, char const *argv[]) {int arr[N][N];int n;printf("please enter n :");scanf("%d",&n);for(int i1;i<n;i){for(int j1;j<i;j){if(j1 |…