算法学习Day1——【数据结构】单调栈

news2024/12/23 23:18:02

1.什么是单调栈以及单调栈的作用

(1)定义

顾名思义,单调栈是一个有序的栈,可能从栈顶到栈底单调递增(单调递增栈),也有可能从栈顶到栈底单调递减(单调递减栈)

(2)用途

单调栈可以在时间复杂度为 O(n)$的情况下,求解出某个元素左边或者右边第一个比它大或者小的元素。

所以单调栈一般用于解决一下几种问题:

1.寻找左侧第一个比当前元素大的元素。

2.寻找左侧第一个比当前元素小的元素。

3.寻找右侧第一个比当前元素大的元素。

4.寻找右侧第一个比当前元素小的元素。

那么我们在这里进行对上述四种问题进行阐述,

1.寻找左侧第一个比当前元素大的元素,我们可以创建一个单调递增栈,把我们这个元素与栈顶元素进行比较,如果栈顶元素小于要该元素,那么直接将栈顶元素弹出,然后继续比较,直到找到第一个比这个元素大的元素,或者说栈为空,如果栈为空,那么说明左边不存在比这个元素更大的元素了

2.寻找左侧第一个比当前元素小的元素,我们创建一个单调递减栈,将这个栈顶元素和该元素进行比较,如果该项元素大于栈顶元素,那么就要将该元素插入,并且此时的栈顶元素就是左侧第一个比该元素小的元素

3.寻找右侧第一个比当前元素大的元素,我们创建一个单调递增栈,然后从左向右遍历,第一个将这个元素从栈中弹出的元素就是右侧第一个比这个元素大的

4.寻找右侧第一个比当前元素小的元素,我们要创建单调递减栈,然后从左向右遍历,就是第一个将该元素从栈中弹出的就是右侧第一个比这个元素小的

(3)伪代码

stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{
	if (栈空 || 栈顶元素大于等于当前比较元素)
	{
		入栈;
	}
	else
	{
		while (栈不为空 && 栈顶元素小于当前元素)
		{
			栈顶元素出栈;
			更新结果;
		}
		当前数据入栈;
	}
}

2.相关例题

1.模版单调栈 

纯模版题,没啥可说的,记得往栈里面存的是结构体就行 

#include<bits/stdc++.h>
using namespace std;
int n;

int f[3000005];
struct node
{
	int w;
	int flag;
}a[3000005];
stack<node> q;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].w;
		a[i].flag=i;
	}
	for(int i=1;i<=n;i++)
	{
		while(!q.empty()&&a[q.top().flag].w<a[i].w)
		{
			f[q.top().flag]=i;
			q.pop();
		}
		q.push(a[i]);
    }
	for(int i=1;i<=n;i++)
	{
		printf("%d ",f[i]);
	}
}

 2.Look Up S

和上面的题一个板子

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
	int h;
	int flag;
}a[100005];
int f[100005];
stack<node> q;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].h;
		a[i].flag=i;
	}
	for(int i=1;i<=n;i++)
	{
		while(!q.empty()&&q.top().h<a[i].h)
		{
			f[q.top().flag]=i;
			q.pop();
		}
		q.push(a[i]);
	}
	for(int i=1;i<=n;i++)
	{
		printf("%d\n",f[i]);
	}
}

3. 求数列所有后缀最大值的位置

 

这题两个知识点,一个是异或操作,另一个是单调栈

#include<bits/stdc++.h>
using namespace std;

struct node{
	unsigned long long w;
	int flag;
}a[1000005];
int n;
long long sum;
stack<node> q;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
    {
     	cin>>a[i].w;
     	a[i].flag=i;
	}
	for(int i=1;i<=n;i++)
	{
		while(!q.empty()&&q.top().w<a[i].w)
		{
			sum^=q.top().flag;
			q.pop();
		}
		q.push(a[i]);
		sum^=q.top().flag;
		printf("%lld\n",sum);
	}
	return 0;
} 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你搞懂AI前沿技术AIGC

人工智能&#xff08;AI&#xff09;领域的发展日新月异&#xff0c;而AIGC&#xff08;Adversarial Instance Generation and Correction&#xff09;作为其中的一项前沿技术备受关注。本文将带你深入探索AIGC&#xff0c;解析其背后的原理、应用场景以及未来发展趋势。 什么…

ACK One x OpenKruiseGame 全球游戏服多地域一致性交付最佳实践

作者&#xff1a;刘秋阳、蔡靖 前言 在当今全球一体化的经济环境下&#xff0c;数字娱乐产业正日益成为文化和商业交流的有力代表。在此背景下大量游戏厂商尝试游戏出海并取得了令人瞩目的成绩&#xff0c;许多游戏以全球同服架构吸引着世界各地广泛的玩家群体。游戏全球化部…

UDP文件传输工具之UDP传输的优点和缺点

在当今快节奏的网络通信时代&#xff0c;UDP以其独特的优势&#xff0c;在众多应用场景中扮演着关键角色。本文将深入探讨UDP的优缺点及其应用场景&#xff0c;并重点介绍镭速软件如何通过技术创新&#xff0c;显著提升UDP传输的效率和可靠性。 UDP传输的优点 UDP的显著优势在…

2024王炸组合!基于Mamba的遥感图像处理引爆顶会!

对比传统方法&#xff0c;基于Mamba的遥感图像处理在计算效率和分析精度方面遥遥领先&#xff0c;Mamba遥感也成为了论文研究的新方向。 具体来说&#xff0c;在融合高分辨率的空间图像和低分辨率的光谱图像获取综合信息方面&#xff0c;Mamba可以提升性能&#xff0c;同时保持…

特斯拉全自动驾驶能力(FSD)或与百度合作;小红书内测自研大模型丨 RTE 开发者日报 Vol.196

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

【工具资源】药物研发平台;物理符号优化平台;手术视频可视化解答

在 AI for Science 的规模化推广过程中&#xff0c;低门槛使用且开源的高性能工具至关重要。一方面&#xff0c;科研人员能够通过上手使用&#xff0c;更加直观地了解 AI 的能力&#xff1b;另一方面&#xff0c;当团队中缺乏交叉学科人才时&#xff0c;已有工具能够减少科研人…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目&#xff1a; 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力&#xff0c;B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等&#xff0c;允许从每组各选出一个CPU进行一次交换。 求两…

C++学习第十课:指针陷阱与引用传递(阶段练习题)

C学习第十课&#xff1a;指针陷阱与引用传递 在C中&#xff0c;指针和引用是两个强大的特性&#xff0c;但它们也可能导致一些常见的错误。本课将深入探讨使用指针时可能遇到的问题&#xff0c;并介绍引用的概念和使用方式。 大纲标题与代码详解 1. 日常使用指针容易犯的错误…

CSS的布局模式

前言&#xff1a; 我们可以看到京东的官网上的一些例子&#xff08;如下图&#xff09;&#xff0c;在同一排中能够存在多个div&#xff0c;这是通过布局方式&#xff08;例如浮动&#xff09;来实现的。 CSS传统的布局模式&#xff1a; <1>普通流&#xff08;又称之为标…

mysql UNION 联合查询

mysql UNION 联合查询 业务需要拉数据&#xff0c;这里需要对查询不同格式的数据进行组装&#xff0c;此处采用联合查询 注意1&#xff1a;null as 设备关爱 &#xff0c;结果为null&#xff0c;表头为设备关爱 注意2&#xff1a; UNION 或者 UNION ALL 联合查询自行选用 注意3…

OpenTK:安装和说明

OpenTK介绍 OpenTK是一个开源、跨平台的游戏开发库&#xff0c;由MonoGame团队创建。它为C#开发者提供了一个简单易用的接口&#xff0c;以便使用OpenGL、OpenAL和OpenCL进行3D渲染、音频处理和并行计算。OpenTK的目标是提供一个一致且高效的框架&#xff0c;让开发者能够专注于…

经典文献阅读之--SurroundOcc(自动驾驶的环视三维占据栅格预测)

0. 简介 环视BEV已经是很多场景中需要的功能&#xff0c;也是视觉代替激光雷达的有效解决方案&#xff0c;而《SurroundOcc: Multi-camera 3D Occupancy Prediction for Autonomous Driving》一吻则代表了这个领域的SOTA算法&#xff0c;文中通过多帧点云构建了稠密占据栅格数据…

windows下安装onlyoffice

文章目录 1、 安装ErLang2、 安装rabbitmq3、 安装postgresql4、 安装onlyoffice(社区版) 1、 安装ErLang 下载地址&#xff1a;https://erlang.org/download/otp_win64_24.2.exe opt_wind64_24.2.exe 直接运行&#xff0c;一步一步安装 2、 安装rabbitmq 下载地址&#xf…

若依:Linux Centos 7.9 安装部署RuoYi前后端集成版

目录 1.虚拟机操作系统版本 2.删除旧的jdk 3.下载JDK 17 &#xff1a; 4.下载 mvn 3.9.6&#xff1a; 5.下载mysql:5.7.44版本 6.git下载若依&#xff1a; 7.修改数据库连接&#xff1a; 8.mvn 清理和打包 9.启动若依&#xff1a; 1.虚拟机操作系统版本 2.删除旧的jd…

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象&#xff0c;以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象&#xff0c;可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…

XY_RE复现(四)舔狗四部曲

一&#xff0c;我的白月光 BOOK框还叉不掉&#xff0c;主函数很长 int __cdecl main(int argc, const char **argv, const char **envp) {__m128 si128; // xmm6__int128 *v4; // raxint v5; // r13dunsigned int v6; // ecx__m128 v7; // xmm0_DWORD *v8; // raxHMODULE Modu…

ROS 2边学边练(37)-- 使用时间参数(C++)

前言 在前几篇内容中&#xff0c;我们已经了解过了tf2广播、tf2监听&#xff0c;并且还了解了如何添加一个坐标系到tf2树图中&#xff0c;以及如何查看坐标系间的转换情况。实际上&#xff0c;是通过lookupTransform函数来查找的&#xff0c;这个函数允许我们查找所有的转换数据…

数据结构中的栈(C语言版)

一.栈的概念 栈是一种常见的数据结构&#xff0c;它遵循后进先出的原则。栈可以看作是一种容器&#xff0c;其中的元素按照一种特定的顺序进行插入和删除操作。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff0c;入数据在栈顶。 出栈&#xff1a;栈的删除操作叫做…

品牌百度百科词条需要什么资料?

品牌百度百科词条是一个品牌的数字化名片&#xff0c;更是品牌历史、文化、实力的全面展现。 作为一个相当拿得出手的镀金名片&#xff0c;品牌百度百科词条创建需要什么资料&#xff0c;今天伯乐网络传媒就来给大家讲解一下。 一、品牌基本信息&#xff1a;品牌身份的明确 品…

神之浩劫2下载教程 MOBA新游神之浩劫2在哪下载/怎么下载

《神之浩劫2Smite 2》重新定义了MOBA游戏的征服模式&#xff0c;为玩家带来更多的互动和进展。最近的开发者深度挖掘展示了游戏地图的全新设计&#xff0c;既简化了基本操作&#xff0c;又丰富了游戏选择。游戏中的敌人也有了新的进展方式。例如&#xff0c;击败火巨人和金之怒…