单调栈

news/发布时间2024/8/25 18:06:45

一、算法描述

本篇文章讲述的数据结构是单调栈,是一种和单调队列类似的数据结构(下一篇文章会讲到)。

单调队列主要用于 \(O(n)\) 解决滑动窗口问题,单调栈主要用于 \(O(n)\) 解决NGE问题(Next Greater Element),也就是对序列中的每个元素,找到上(下)一个比它大(小)的元素,原理相同。

以下面的题目为例,找到左边第一个比它小的元素:

我们可以发现,如果当前元素比左边的数小,那么那些左边的数就不会作为答案输出。

所以我们可以维护一个栈,当遇到新元素时,只要栈不为空且当前元素 ≤ 栈顶元素,就一直弹出栈顶元素,最后将当前元素入栈。这样形成的一个栈就是单调递增的,答案也就是当前栈顶元素。

二、题目描述

给定一个长度为 \(N\) 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 \(−1\)

输入格式

第一行包含整数 \(N\),表示数列长度。

第二行包含 \(N\) 个整数,表示整数数列。

输出格式

共一行,包含 \(N\) 个整数,其中第 \(i\) 个数表示第 \(i\) 个数的左边第一个比它小的数,如果不存在则输出 \(−1\)

数据范围

\(1≤N≤10^5\)
\(1≤数列中元素≤10^9\)

输入样例:

5
3 4 2 7 5 

输出样例:

-1 3 -1 2 2 

三、题目来源

AcWing算法基础课-830.单调栈

四、源代码

#include <iostream>using namespace std;const int N = 100010;int n;
int st[N], tt;int main()
{cin >> n;for (int i = 0; i < n; ++i){int x;cin >> x;while (tt && st[tt - 1] >= x)   tt -- ;if (tt) cout << st[tt - 1] << ' ';else    cout << -1 << ' ';st[tt ++ ] = x;}return 0;
}

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

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

相关文章

golang常见数据结构实现原理

chan1.chan数据结构src/runtime/chan.go:hchan定义了channel的数据结构:type hchan struct {qcount uint // 当前队列中剩余元素个数dataqsiz uint // 环形队列长度,即可以存放的元素个数buf unsafe.Pointer // 环形队列指针elemsize uint16 …

Android踩坑小记-在onResume中申请权限

Android踩坑小记-在onResume中申请权限 最近遇见一个问题,在onResume中申请权限,比如申请定位权限,如下所示: @Overrideprotected void onResume() {super.onResume();requestPermission();}@TargetApi(Build.VERSION_CODES.M)private void requestPermission(){LogUtils.i…

获取Windows内核对象的索引与对象名

下列提出两种获取对象名的方式通过_OBJECT_TYPE::Name获取对象名称,通过_OBJECT_TYPE::Index获取对象索引; 通过NtQueryObject的方式获取,r0与r3通用,代码如下:typedef enum _OBJECT_INFORMATION_CLASS {ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformat…

SIEM系列|一文读懂 Linux 日志安全分析之文件监控

摘自:https://zhuanlan.zhihu.com/p/259808863 背景介绍在Linux操作系统中,所有内容都是以文件的形式保存和管理的,包括普通文件、目录、网络通信资源等都是文件,即“一切皆文件”。基于这种机制,针对Linux系统层的攻击方式,本质上往往是通过各种方式,对某些敏感文件进行…

机密计算如何引领AI开发的安全未来

先进的AI模型比如机器学习和生成式AI为加速医疗研究、促进业务增长和协助打击犯罪等领域带来了巨大的潜力。但是若不正确使用,在数据用于训练和保护模型后这些模型可能带来重大风险。为应对这一挑战,2023年10月,美国拜登-哈里斯政府颁布了一项行政命令,旨在确保“AI的安全、…

Python中的循环

一、循环语句概念 是一种重复执行某段代码的结构,通常被用于遍历或处理一组数据,或者重复执行一些代码直到满足某个条件为止 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示:二、while循环 Python 中 while 语句的一般形式: while 判断条件(cond…

ISCTF WEB

圣杯战争!!! 前置知识: 反序列化魔法函数:(以俩个下划线开头的方法称为魔法函数)__construct() 在创建对象时候初始化对象,一般用于对变量赋初值。创建一个新的类时,自动调用该方法__destruct() 和构造函数相反,当对象所在函数调用完毕后执行.即当一个类被销毁时自…

【HarmonyOS】模拟器一直停留在开机页面,无法进入桌面

​【关键字】模拟器,qemu-error.log,No sound driver【问题背景】 模拟器一直停留在开机页面,无法进入桌面 ​​【解决方案】 qemu-error.log中有以下报错 ​ 检查立体声混音是否打开,或者重新安装以下音卡驱动 ​ ​

2023-2024-1 20211327 myxxd(课上测试)

myxxd(课上测试) 学***d的使用,提交至少3个应用截图xxd的主要功能是什么?需要使用什么系统调用来实现?写出你的推导过程,命令 xxd 主要用于查看文件的十六进制表示,并提供了一些额外的功能,如生成C语言风格的数组表示。它的主要功能包括:查看文件的十六进制表示: 显示文…

每天使用Spring 框架,那你知道 lazy-init 懒加载原理吗?

懒加载是Spring框架中的一个重要特性,它允许我们将bean的实例化推迟到第一次使用时。懒加载的主要用途是提高应用程序的启动性能,减少不必要的资源消耗。 一、懒加载的用途 在大型的应用程序中,有些bean可能只在特定的条件下才会被使用到。如果在应用程序启动时就实例化所有…

读像火箭科学家一样思考笔记12_实践与测试(下)

测试与实践1. 舆论的火箭科学 1.1. 如果苹果违反了“即飞即测”原则,那苹果的iPhone就不会问世了 1.1.1. iPhone在其上市前的民意调查中相当失败 1.1.1.1. iPhone不可能获得太大市场份额,不可能。 1.1.1.1.1. 微软前CEO史蒂夫鲍尔默(Steve Ballmer) 1.1.2. iPhone并没有试图…

图形API和GPU光线追踪分析

图形API和GPU光线追踪分析 阐述目前市面上的几种流行图形API对光线追踪支持的现状和技术。 1 DirectX RayTracing(DXR) DirectX RayTracing(DXR)是DirectX 12引入的用以支持硬件光线追踪的图形API特性集。在最高级别,DXR为DirectX 12 API引入了四个新概念:加速结构是一个…

最终 Linux课后技术总结

第11章 yum管理器 yum管理器概述yum——Linux上的软件包管理器: 在Linux操作系统中,软件包管理器是一种用于安装、更新、升级和删除软件包的工具。其中,Yum是一种常用的软件包管理器,特别适用于基于RPM(Red Hat Package Manager)的Linux发行版。本文将深入介绍Yum的原理、…

k8s の Pod

一、k8s 中的资源和组件组件是为了支撑 k8s 平台的运行,而提前安装好的软件资源是如何去使用 k8s 能力的定义,比如 k8s使用 pod 去管理业务应用,那么 pod就是 k8s的一类资源。先要查看 k8s 下的所有的资源,可以使用如下命令 kubectl api-resourceskubectl api-resources -o…

下拉框为必录字段,要求下拉框隐藏时不触发校验规则。问题:隐藏时候总是触发校验规则

问题 下面是省份公司显示时候的页面展示:省份公司的下拉框隐藏时候,如页面所示,点击查询,还是有提醒文字 代码如下: <el-form-item prop="province"><el-select v-if="visibility.province" v-model="searchQuery.province" placeh…

springboot集成springsecurity

转载自:www.javaman.cn1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程认证管理流程图…

四、Docker 镜像

1. 什么是镜像 UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem…

如何一分钟内画好可视化图形

一、定类数据饼图描述:用形状类似“饼”的形态描述数据的占比,并且参与绘制的数值没有负值,比如想要直观的查看“月生活费各个板块的占比”。 操作:以SPSSAU为例,使用“频数分析”即可。示例:圆环图描述:圆环图显示各个部分与整体之间的关系,可以包含多个数据,比如想要…

wpf 封装 时间日期 双向绑定 输入框 控件

简单封装一个时间日期 输入框 DateTimePicker.xaml<UserControl x:Class="FullApp5DateTimePicker.Modules.ModuleName.Views.DateTimePicker"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microso…

arthas 热更新docker容器中的代码

1、将修改并编译好的class文件复制到docker容器中docker cp BasicController.class arthas-demo:/将文件BaseiController.class复制到arthas-demo容器根目录下 BaseiController.class:编译后的代码 arthas-demo:容器名2、进入容器,运行arthas 参见:地址 3、替换文件retrans…
推荐文章