首页 > 编程语言 >单调栈算法

单调栈算法

时间:2024-02-23 17:26:02浏览次数:37  
标签:入栈 左边 元素 栈顶 算法 单调 第一个

 

定义

栈内元素单调按照递增(递减)顺序排列的栈。 主要用于找到每一个元素左边或右边,第一个比它大或小的数时,可使用单调栈算法。

时间复杂度

由于每个元素最多各自进出栈一次,复杂度是O(n)

功能

递增单调栈:

在一个队列中针对每一个元素从它右边找到第一个比它小的元素 在一个队列中针对每一个元素从它左边找到第一个比它小的元素

递减单调栈:

在一个队列中针对每一个元素从它右边寻找第一个比它大的元素 在一个队列中针对每一个元素从它左边寻找第一个比它大的元素  

算法步骤

示例1 递增单调栈

下一个元素要入栈时,先弹出所有比它大的元素 取一组元素为 5,3 ,4 ,7,2,9; step1:5入栈; step2:想让3入栈,发现栈顶元素5大于3   弹出5,发现栈为空,3入栈。 step3:想让4入栈,发现栈顶元素3比4小,直接入栈 step4:7同理直接入栈 step5: 想让2入栈,2是最小的,弹出所有元素后入栈 step6:想让9入栈,9大于2,直接入栈 所以栈中最终的元素是2,9。   由于大于入栈元素的会先被弹出,所以栈中留下的,一定是入栈元素左边比它小的元素 弹出大于元素后,栈顶元素就是入栈元素的左边第一个比它小的元素 相对的,入栈元素是栈顶元素的右边第一个比它大的元素

递增单调栈实例代码

#include<iostream>
#include<stack>
using namespace std;
int main()
{
        int n;
        cin>>n;
        stack<int>st;  //栈容器
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            while(!st.empty()&&st.top()>x)st.pop(); //弹出所有大于x的元素
            cout<<(st.empty()?-1:st.top())<<endl;  //输出栈顶元素
            st.push(x);  //x入栈
        }
        return 0;
 } 

 

标签:入栈,左边,元素,栈顶,算法,单调,第一个
From: https://www.cnblogs.com/jk-2048/p/18029994

相关文章

  • 排序算法-归并排序
    时空复杂度时间复杂度:O(nlogn)空间复杂度:O(n)使用了分治思想优势1.稳定归并的时空复杂度非常稳定的,不论是在哪种情况下,归并算法的时间复杂度都不变,2.高效归并算法计算效率相比其他算法也是非常快的 思路图解分把一个有n个元素的数组,分成n个有1个元素的数组然后边比较......
  • [几何算法]任意多边形求面积
    求任意平面多边形的面积通过鞋带定理,在已知多边形各顶点的情况下,可以快速计算出其面积问题分析设一个多边形顶点按逆时针或顺时针顺序为$$P_1(x_1,y_1),P_2(x_2,y_2),\ldots,P_n(x_n,y_n)$$,其中$$P_1=P_{n+1}$$(首尾相连形成闭合多边形)。根据鞋带定理,该多边形的......
  • 基于yolov2深度学习网络的车辆行人检测算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本MATLAB2022a 3.算法理论概述      近年来,深度学习在计算机视觉领域取得了显著成果,特别是在目标检测任务中。YOLO(YouOnlyLookOnce)系列算法作为其中的代表,以其高效和实时的性能受到广泛关注。YOLOv2,作为YOL......
  • 基于WIFI指纹的室内定位算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述        随着移动互联网和物联网技术的飞速发展,位置服务(LBS)已成为许多应用的核心功能,如导航、社交网络和智能物流等。室外定位技术,如全球定位系统(GPS),已相当成熟并广泛应用。然而,由于建......
  • 类欧几里得算法
    要求类似于这样的东西:\[\begin{align*}f(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}\\g(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}^2\\h(n,a,b,c)&=\sum\limits_{i=0}^......
  • day41 动态规划part3 代码随想录算法训练营 96. 不同的二叉搜索树
    题目:96.不同的二叉搜索树我的感悟:这题,考的概率不大,听一遍,过一遍就行。理解难点:二叉搜索树定义为什么是累加的听课笔记:代码示例:classSolution:defnumTrees(self,n:int)->int:dp=[0]*(n+1)#创建一个长度为n+1的数组,初始化为0d......
  • day40 动态规划part3 代码随想录算法训练营 343. 整数拆分
    题目:343.整数拆分我的感悟:题目很难,但我动力十足!!理解难点:如何拆分为什么要保留dp[i]听课笔记:代码示例:classSolution:defintegerBreak(self,n:int)->int:#思路:#dp[i]是到目前为止能拆分取的最大值#dp[i]可以拆成j*(集合)......
  • 十大经典排序算法
    十大经典排序算法.md0、算法概述0.1算法分类****十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间......
  • 文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题
    四、用go语言,对输入链长度为n的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?文心一言:矩阵链乘法问题是一个经典的动态规划问题,其中给定一个矩阵链,我们需要确定一个乘法顺序,使得计算该链所需的总标量乘法次数最少。子问题图(也叫DAG,有......
  • Python数据结构与算法05——快速排序
    快速排序:递归defquick_sort(aimlist,first,last):#打印当前排序状态print(aimlist)#如果子列表只有一个元素或没有元素,直接返回iffirst>=last:return#初始化低位、高位和中间值low=firstheigh=lastmid=aimli......