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

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;
} 

 

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

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

相关文章

芯启智行丨基于G32A1445的汽车音乐律动氛围灯解决方案

随着智能汽车技术的深度渗入&#xff0c;汽车照明作为汽车设计的重要组成部分&#xff0c;正在重塑驾驶员与汽车的互动方式&#xff0c;从简单的照明工具优化升级为承载更多丰富功能和不同应用场景的智能化安全装置。现代智能车型广泛配备了前照灯、车内环境氛围灯、尾灯等汽车…

栈和链表的区分

栈&#xff08;Stack&#xff09;&#xff1a; 栈是一种特殊的线性表&#xff0c;遵循“后进先出”&#xff08;Last In First Out, LIFO&#xff09;原则。栈通常用数组或链表来实现&#xff0c;但重点在于其操作的限制而非底层数据结构。无论使用顺序栈&#xff08;基于数组…

读懂一本书笔记

文章目录 引言 我是一个用读书改变自己生活的人01 会读书&#xff0c;更要会讲书复杂时代&#xff0c;阅读是大众反脆弱的武器你焦虑吗&#xff1f;如何从“单向度的人”变为“多向度的人”第一&#xff0c;读书是主动的学习方式第二&#xff0c;读书是有针对性的学习方式 讲书…

kettle下载安装

下载方式&#xff1a; 1.官网下载 kettle下载链接&#xff1a; 老网站下载链接&#xff1a;https://sourceforge.net/projects/pentaho/files/这个网站已经弃用了 新网站地址获取方法&#xff1a;老网站下载链接打开&#xff0c;可以看到一个pdf下载链接&#xff0c;下载pdf 打…

二维码门楼牌管理应用平台建设:共治力量信息管理的革新

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、共治力量信息管理的重要性三、二维码门楼牌管理应用平台在共治力量信息管理中的应用四、二维码门楼牌管理应用平台的优势与挑战五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成…

Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

CACHE TABLE的能力 使用此语法&#xff0c;可以由用户自定义要缓存的结果集&#xff0c;实际上就是一个临时表&#xff0c;不过数据存储在Spark集群内部&#xff0c;由Application所分配的executors管理。 一旦定义了一个缓存表&#xff0c;就可以在SQL脚本中随处引用这个表名…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…

【Qt】QtCreator忽然变得很卡

1. 问题 Qt Creator忽然变得很卡。电脑里两个版本的Qt Creator&#xff0c;老版本的开启就卡死&#xff0c;新版本好一点&#xff0c;但是相比于之前也非常卡&#xff0c;最明显的是在 ctrl鼠标滚轮 放大缩小的时候&#xff0c;要卡好几秒才反应。 2. 解决方案 2.1 方法1 关…

XL520无线接收芯片,2.2ms超低启动时间,-110dBm高接收灵敏度

XL520接收芯片采用SOP8封装&#xff0c;适用于300MHz- 440MHz频率范围&#xff0c;正常工作电压范围2.0~5.5V&#xff0c;工作电流在3.0~3.2mA之间。它具有快速的启动时间&#xff08;2.2ms&#xff09;和高达-110dBm的接收灵敏度&#xff0c;非常适合对低功耗要求严格的设备。…

测试工程师——招聘分析

测试工程师 随着互联网行业的高速发展,快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求,而在短期迭代的快节奏中,传统测试工作面对更大压力,无法持续提供高效率高质量的人力支撑,所以越来越多的企业需要技术更为全面的测试开发工程师。测试开发 本质上属于测…

Web安全的最后一道防线:细谈Gobuster的目录/文件/Vhost/DNS子域名暴力破解艺术

一、前言 Gobuster是一款用go语言编写的对于网站目录/文件、DNS子域、虚拟主机vhost进行暴力穷举的开源工具&#xff0c;常用于安全领域&#xff0c;其常用的暴力破解模式到目前为止&#xff08;3.6版本&#xff09;有如下几种&#xff1a; 模式含义dir最经典的文件路径/目录破…

深入Rust标准库:必备的Rust语言高级指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

力扣---二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []实现方法&…

网络安全漏洞分析之远程代码执行

介绍 Apache Flume 是一个分布式的&#xff0c;可靠的&#xff0c;并且可用于高效地收集&#xff0c;汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许多故障转移和恢复机制&#xff0c;并且具有健壮性和容错性。它使用…

CSS @keyframes 动画:颜色变化、背景旋转与放大缩小

在CSS中&#xff0c;keyframes 是一个强大的工具&#xff0c;它允许我们创建复杂的动画效果。今天&#xff0c;我们将一起探索如何使用 keyframes 来实现颜色变化、背景旋转以及放大缩小的动画效果。 动画会在 2 秒内循环播放&#xff0c;并在不同的时间点改变盒子的背景颜色和…

JTextField限制只能输入特定字符

1. 背景 最近写了一个公司内部用的通用MQTT协议JMeter自定义采样器&#xff0c;自定义表达式的处理手法与《JMeter通用Http采样器》https://blog.csdn.net/camelials/article/details/127135630 一致。不同的是协议变了、荷载构造方式变了等。另外&#xff0c;由于结合了自身应…

第三方软件测试机构的优势

软件测试机构在软件开发和验收过程中扮演着至关重要的角色&#xff0c;其优势主要体现在以下几个方面&#xff1a; 专业性&#xff1a;软件测试机构通常拥有专业的测试团队&#xff0c;这些团队成员具备丰富的测试经验和深厚的专业知识&#xff0c;能够准确识别软件中的潜在问…

Three.js杂记(十五)—— 汽车展览(下)

在上一篇文章Three.js杂记&#xff08;十四&#xff09;—— 汽车展览上 - 掘金 (juejin.cn)中主要对切换相机不同位置和鼠标拖拽移动相机焦点做了简单的应用。 那么现在聊聊该如何实现汽车模型自带的三种动画展示了&#xff0c;实际上可以是两种汽车前后盖打开和汽车4车门打开…

大模型实战:如何使用图数据库提高向量搜索精确度?

文本嵌入和向量搜索技术可以帮助我们根据文档的含义及其相似性来检索文档。但当需要根据日期或类别等特定标准来筛选信息时&#xff0c;这些技术就显得力不从心。 为了解决这个问题&#xff0c;我们可以引入元数据过滤或过滤向量搜索&#xff0c;这允许我们根据用户的特定需求…

开源AI智能名片商城小程序:深度解读IMC(IP、MarTech、Content)视角

在数字化浪潮中&#xff0c;私域流量的运营已成为企业不可或缺的增长引擎。而开源AI智能名片商城小程序&#xff0c;则是以一种全新的视角——IMC&#xff08;IP、MarTech、Content&#xff09;&#xff0c;为企业打开私域流量运营的新篇章。今天&#xff0c;我们就来一起深入解…