单调栈——AcWing.830单调栈

news2025/4/8 1:57:53

单调栈

定义

单调栈是一种特殊的数据结构,栈内元素保持某种单调性(通常是单调递增或单调递减)。

运用情况

  • 求解下一个更大元素或下一个更小元素。
  • 计算每个元素左边或右边第一个比它大或小的元素。

注意事项

  • 要明确单调栈是递增还是递减。
  • 注意处理边界情况。
  • 考虑时间复杂度:单调栈的时间复杂度通常为 O(n),但在某些情况下可能需要进一步优化。

解题思路

以求解下一个更大元素为例:

  1. 从左到右遍历数组。
  2. 当栈为空或者当前元素大于等于栈顶元素时,将当前元素入栈。
  3. 当当前元素小于栈顶元素时,栈顶元素出栈,此时当前元素就是栈顶元素的下一个更大元素。

通过以上步骤,可以在一次遍历中找到每个元素左侧第一个比它大的元素,时间复杂度为 O(n)。

例如,对于数组 [1, 3, 2, 4],使用单调递增栈来求解下一个更大元素:

  • 先将 1 入栈。
  • 3 大于 1,将 1 出栈,3 入栈,此时 3 的下一个更大元素是无。
  • 2 小于 3,2 入栈。
  • 4 大于 2 和 3,2 出栈,4 是 2 的下一个更大元素,3 出栈,4 是 3 的下一个更大元素,然后 4 入栈。

处理栈为空的情况

  1. 直接返回:如果在栈为空的情况下,没有其他有效的操作或结果可以返回,那么可以直接返回一个特定的值或标志,表示栈为空的情况。
  2. 初始化或重置:有些情况下,可以在栈为空时进行一些初始化或重置的操作,例如将栈的一些属性设置为初始值,或者将相关的数据结构进行初始化。
  3. 抛出异常:如果栈为空的情况被视为一种错误或异常情况,可以抛出一个异常来通知调用者进行相应的处理。
  4. 特殊逻辑处理:根据具体的问题需求,可以在栈为空时执行一些特殊的逻辑处理。这可能涉及到对问题的特殊判断或采取其他替代的计算方式。

例如,在寻找左侧第一个比当前元素大的元素的问题中,当栈为空时,可以直接将当前元素入栈,因为此时没有左侧更大的元素。

AcWing.830单调栈

题目描述

830. 单调栈 - AcWing题库

运行代码

#include<iostream>
using namespace std;
const int N = 1e5+ 10;
int main()
{
	int n,i,tt,stk[N],top=-1;
	cin >> n;
	while (n--)
	{
		int x;
		cin>>x;
	    while(tt&&stk[tt]>=x){tt--;}
	    if(tt) cout<<stk[tt]<<' ';
	    else cout<<-1<<' ';
	    stk[++tt]=x;
	}
}

代码思路

  1. 初始化:定义了变量n为序列长度,i为循环变量(未使用),tt作为栈顶指针初始化为-1,stk[]作为单调栈存储元素的下标,top初始化为-1以标记栈为空。

  2. 输入与循环:首先读取序列长度n,然后进入循环,每次循环读取一个元素x

  3. 单调栈处理

    • 使用while循环检查栈顶元素(实际上为之前处理过的元素对应的下标)是否大于等于当前元素x。如果是,则这些元素不可能是后续元素的下一个更大元素,因此从栈中弹出,更新栈顶指针tt
    • 弹出操作完成后,如果栈非空(即tt不为-1),说明栈顶元素是当前x的下一个更大元素,输出该元素的值(注意,代码直接输出了栈顶的值,实际上是栈中元素对应的原序列值,这里可能存在误导,因为栈中存储的是下标)。
    • 如果栈空,说明当前元素右边没有更大的元素,输出-1。
    • 最后,将当前元素的下标入栈,因为后续的元素可能以它为下一个更大元素。
  4. 循环直至所有元素处理完毕

改进建议

  1. 变量命名:变量命名可以更加明确,例如将tttop统一为更清晰的名称,如stackTop,将stk改为更具描述性的名称,如indexStack,并明确区分存储元素值和下标的栈。

  2. 输出逻辑调整:代码直接从栈中输出元素值是不准确的,应该存储元素值而不是下标,并在需要时从原序列中提取元素值输出。或者,在入栈时直接存储元素值,并调整输出逻辑。

  3. 添加注释:在关键操作前后添加注释,解释每部分代码的功能,提高代码可读性。

  4. 考虑边界情况:虽然题目描述中可能默认输入合法,但在实际编程中,增加对输入数据合法性的检查是一个好习惯。

  5. 输出格式:根据实际需求,可能需要在所有元素处理完后输出一个换行符,以符合常见输出格式。

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

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

相关文章

七、IP路由原理和路由引入

目录 一、IP路由原理 二、路由引入 2.1、双点双向路由引入 2.2、路由回灌 三、路由策略与路由控制 路由匹配工具&#xff08;规则&#xff09; ACL IP前缀列表 路由控制工具&#xff08;控制&#xff09; 策略工具1 策略工具2 搭配组合 组…

CCAA质量管理【学习笔记】​ 备考知识点笔记(一)

第一部分 质量管理体系相关标准 《质量管理体系基础考试大纲》中规定的考试内容&#xff1a; 3.1质量管理体系标准 a) 了解 ISO 9000 系列标准发展概况&#xff1b; b) 理 解 GB/T19000 标准中涉及的基本概念和质量管理原则&#xff1b; c) 理 解GB/T19000 标准中的部分…

mybatis中SQL语句运用总结

union 连接查询 连接两个表后会过滤掉重复的值 <resultMap id"BaseResultMap" type"com.sprucetec.pay.etl.model.BillDetail"><id column"id" jdbcType"INTEGER" property"id"/><result column"pay_…

Docker中部署Jenkins+Pipline流水线基础语法入门

场景 DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;&#xff1a; DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;-CSDN博客 DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解…

深度剖析淘宝扭蛋机源码:打造趣味性电商活动的秘诀

在当今电商市场中&#xff0c;如何吸引用户的注意力、提升用户的参与度成为了各大电商平台竞相追求的目标。淘宝扭蛋机作为一种新型的电商活动形式&#xff0c;以其趣味性和互动性深受用户喜爱。本文将深度剖析淘宝扭蛋机源码&#xff0c;探讨其如何打造趣味性与互动性并存的电…

数仓建模—OLTP 和 OLAP

数仓建模—OLTP 和 OLAP 前面我们在数仓建模—数仓初识 中提到了OLTP 和 OLAP 两个概念 OLAP 是 On-Line Analytical Processing(联机分析处理)的缩写。广义的 OLAP 泛指数据查询分析,像报表、即席查询、多维分析都属于 OLAP 的范畴。 OLTP 和 OLAP 最大区别在于前者会产…

C++入门 vector介绍及使用

目录 vector的介绍及使用 vector常用接口的介绍及使用 vector的定义 vector iterator 的使用 vector 空间增长问题 vector 增删查改 push_back/pop_back insert & erase & find operator[ ]的遍历 vector的介绍及使用 vector的文档介绍 vector是表示可变大…

DevOps学习回顾01-技能发展路线-岗位能力-体系认知(射箭和拉弓的区别)

事为先&#xff0c;人为重–事在人为 参考来源&#xff1a; 极客时间专栏&#xff1a;DevOps实战笔记&#xff0c;作者&#xff1a;石雪峰 课程链接&#xff1a;https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性&#xff08;Volatility&…

都说可视化设计是面向B端的点睛之笔,看到这些,我信了。

抽象复杂的B端系统&#xff0c;如果用可视化图表/逻辑图表现处理来 &#xff0c;那对于系统来说绝对是画龙点睛之笔&#xff0c;大美B端工场带领大家感受一下。 图形可视化设计在B端系统中被认为是点睛之笔的理由如下&#xff1a; 1. 提升数据可理解性&#xff1a; B端系统通…

代码随想录——组合总和(Leetcode LCR81)

题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();public List<List<Integer>> combinationSum(int[] candidates, int target) {b…

Java——面向对象进阶(三)

前言&#xff1a; 抽象类&#xff0c;接口&#xff0c;内部类 文章目录 一、抽象类1.1 抽象方法1.2 抽象类1.3 抽象类的使用 二、 接口2.1 接口的定义和实现2.2 default 关键字2.3 实现接口时遇到的问题 三、内部类3.1 成员内部类3.2 静态内部类3.3 成员内部类3.4 匿名内部类&a…

qmt量化交易策略小白学习笔记第32期【qmt编程之获取行业概念数据--如何获取迅投行业成分股数据】

qmt编程之获取迅投行业成分股数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取迅投…

大模型是什么?能干嘛?怎么学?

引言 随着人工智能技术的飞速发展&#xff0c;大模型研究已成为该领域的一大热点。这些研究覆盖了众多方向&#xff0c;每个方向都面临着独特的研究焦点和挑战。本文将逐一探讨一些备受关注的研究方向&#xff0c;包括检索增强生成RAG、大模型Agent、Mamba、MoE、LoRA等&#…

Star-CCM+自动网格执行方法与设置技巧

在Star中进行一个仿真项目时,有时会创建多个自动网格。网格创建结束后需要执行。在Star中,网格执行可以分为三种。分别是:单独执行操作;多个执行操作;全部执行操作。接下来将三种执行操作的方法与步骤进行介绍。 其次,如果不习惯用自定义控制网格,有时在一个项目中就会…

new Set( )的基本使用以及如何去重对象数组

目录 Set 对象方法 Set 对象作用 实现数组的去重 实现字符串的去重 实现并集 交集 差集 实现去重对象数组 相关参考资料 在 ES6 中&#xff0c;引入了一个新的数据结构类型&#xff1a;Set。而 Set 与 Array 的结构是很类似的&#xff0c;且 Set 和 Array 可以相互进…

散文:乡村回忆

散文&#xff1a;乡村回忆 在记忆的长河中&#xff0c;旧时代如同一本泛黄的相册&#xff0c;静静地躺在时光的角落。每当我翻开那些尘封的照片&#xff0c;那些遥远而又熟悉的画面便跃然纸上&#xff0c;带我回到了那个纯真的年代。 那时的天空总是那么蓝&#xff0c;那么纯…

基于python-CNN的常见鱼类分类识别-含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89383072 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…

哪些因素驱动新零售发展?新零售与传统零售、电子商务区别在哪?

零售业正经历着一场前所未有的变革&#xff0c;这场变革由多种因素驱动&#xff0c;涉及技术、消费习惯以及商业模式的全面升级。我们称之为”新零售”&#xff0c;它不仅仅是一个概念&#xff0c;更是零售业未来发展的方向。新零售的兴起&#xff0c;标志着零售行业正在迈向一…

[图解]《分析模式》漫谈04-Martin Fowler叫的是哪家的士

1 00:00:01,230 --> 00:00:04,190 今天我们来探讨一个有趣的话题 2 00:00:05,130 --> 00:00:08,350 Martin Fowler&#xff0c;他叫的是哪一家的的士 3 00:00:11,980 --> 00:00:15,240 第2章这里&#xff0c;Martin Fowler写 4 00:00:15,250 --> 00:00:18,550 他…