数据结构——单调栈

这篇具有很好参考价值的文章主要介绍了数据结构——单调栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前导:

        队列,栈,前面的链接是对普通的栈,和普通的队列的一个讲解,如果没有对普通的栈和队列不了解的小伙伴可以先看看前面链接中的讲解;

        什么是单调,一个序列呈递增或者递减,并且没有一个位置违反了这个递增递减的性质,那么这个序列就算单调序列;

数据结构——单调栈,数据结构,c语言,算法

单调栈

        咱么先讲单调栈,什么是单调栈,知名知其意,栈里面的元素应该是单调的;而单调栈的作用就是去维护它里面的元素成单调性,例如它可以用来找某个元素左右侧最近比他大比他小的元素的位置;下面直接来图片演示他是如何操作的:

       初始状态数据结构——单调栈,数据结构,c语言,算法       开始入栈:

数据结构——单调栈,数据结构,c语言,算法

        一直入栈直到索引3时: 数据结构——单调栈,数据结构,c语言,算法

数据结构——单调栈,数据结构,c语言,算法

        现在继续入栈,到索引5,如果直接入栈索引5又破坏了单调性,那么又需要出栈元素:

数据结构——单调栈,数据结构,c语言,算法

数据结构——单调栈,数据结构,c语言,算法

        最后通过,这样的操作之后,最终结果为:

数据结构——单调栈,数据结构,c语言,算法

单调栈的作用

       单调栈的主要作用是在处理数据序列中,帮助快速解决一些需要维护单调性的问题,例如:
        1. 寻找下一个更大元素或更小元素:单调栈可以用于查找某个元素右侧或左侧的第一个比它大或小的元素,这在解决一些问题中非常有用,比如上图中索引2位置的92右边最近比他小的就是索引3的65;

        2.解决其他需要维护单调性的问题:除了上述示例,单调栈还可用于解决其他需要维护单调性的问题,如找到数组中连续子数组的最大或最小值。

        等等,这些需要思考问题的过程中来进行转换,而不是死记硬背,这个就像数学一样,你背下了公式,但是你也不一定会做题,所以需要多做题进行来加深自己的逻辑框架。

例题:

        这个数据结构直接去实现没有太大的作用,所以选择一个题目进行来讲解:

        leetcode 84

        让你求最大矩形的面积,而这个问题就是进行枚举,然后求每一个矩形的面积,而求每一个矩形的面积如何求,那么这里就可以用到单调栈;

        如何求该位置的面积:

        数据结构——单调栈,数据结构,c语言,算法

        初始化,单调栈:

数据结构——单调栈,数据结构,c语言,算法

        然后可能会有疑问,觉得现在还是没有头绪,没关系往后看:

数据结构——单调栈,数据结构,c语言,算法

        然后继续上面的操作:

数据结构——单调栈,数据结构,c语言,算法

数据结构——单调栈,数据结构,c语言,算法

        而从数组右边开始,就是这样:

数据结构——单调栈,数据结构,c语言,算法

        同样的维护单调栈的性质,和左边遍历数组的操作一样,我就不画图了;

        然后一直进行这样维护单调栈的性质,最终得到结果:

数据结构——单调栈,数据结构,c语言,算法

        然后通过两个数组得到,每个位置可以得到的最大的矩形面积,然后再枚举一次数组,进行得到最终最大矩形面积:

        数据结构——单调栈,数据结构,c语言,算法

        数据结构——单调栈,数据结构,c语言,算法

        最终找到题目要求的答案;

int largestRectangleArea(int* heights, int heightsSize){
    int n = heightsSize;
    int l[n + 5], r[n + 5];//创建l,r数组
    int s[n + 5];//创建栈
    memset(s, 0, sizeof(s));//初始化清空栈
    int top = -1;//top = 0,-1都可以,只是有些条件需要变化一下,这是不影响的
    s[++top] = -1;//入栈虚拟位置
    for (int i = 0; i < n; i++) {
        while (top > 0 && heights[s[top]] >= heights[i]) top--;//top > 0,虚拟位置一直存在栈中,就不用再创建新数组来添加虚拟位置,相当于虚拟位置的高度-1在心中
        l[i] = s[top]; //将最近做左边比i位置高度矮的最近位置记录下来
        s[++top] = i; //入栈i,现在的栈已经维护到入栈i位置一样成单调递增
    }
    top = -1;//初始化栈顶指针
    s[++top] = n;//将虚拟位置入栈
    for (int i = n - 1; i >= 0; i--) {//和上面的逻辑一样,就不解释了
        while (top > 0  && heights[s[top]] >= heights[i]) top--;
        r[i] = s[top];
        s[++top] = i;
    }
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int sum = heights[i] * (r[i] - l[i] - 1);//枚举找每个位置的最大面积
        ans = fmax(sum, ans);//记录最大矩形面积
    }
    return ans;
}

 单调队列明天会出文章续上,这篇已经花了4个小时了,觉得有用给作者一个赞吧;文章来源地址https://www.toymoban.com/news/detail-699886.html

到了这里,关于数据结构——单调栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言数据结构与算法

    冒泡排序 例题 顺序表下的 冒泡排序 注意:冒泡排序 稳定,最多执行n(n-1)/2次 选择排序不稳定,平均比较次数n(n-1)/2 直接插入排序,是在有序基础上,速度最快且稳定的排序方法。 希尔排序是 不稳定的 顺序查找 二分查找(非递归) 二分查找(递归) 数组 链表 查询 快 慢

    2024年02月06日
    浏览(74)
  • 数据结构和算法——用C语言实现所有图状结构及相关算法

    本文所有代码均在仓库中,这是一个完整的由纯C语言实现的可以存储任意类型元素的数据结构的工程项目。 首先是极好的工程意识,该项目是一个中大型的CMake项目,结构目录清晰,通过这个项目可以遇见许多工程问题并且可以培养自己的工程意识。 其次是优秀的封装性(

    2024年02月06日
    浏览(222)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(54)
  • C语言 数据结构与算法 I

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。 首先是环境,学C++时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一

    2024年02月09日
    浏览(42)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(59)
  • 【C/C++数据结构与算法】C语言数据存储

    目录 一、大小端存储 二、整型提升和截断 三、数据的二进制存储 四、结构体内存对齐 大端存储 :数据的低位字节存储在高地址 小端存储 :数据的低位字节存储在低地址 不同编译器有不同的存储方式 提升 :短字节数据类型 --- 长字节数据类型 截断 :长字节数据类型 --

    2024年02月09日
    浏览(42)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(44)
  • (C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的。为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人

    2024年02月08日
    浏览(49)
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

    原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len l e n 。 问最少可以拆分成多少个连续子数组,如果不可以,则输出 − 1 -1 − 1 1 ≤ n , l e n ≤ 1 0

    2024年02月06日
    浏览(50)
  • 『初阶数据结构 • C语言』② - 算法为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。   算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。  准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包