数据结构学习(一)栈

文章介绍了栈的基本概念,特别是单调栈的应用,如维护区间极值、解决特定模式匹配问题、括号匹配、格式校验和计算表达式等。通过一系列实例展示了如何使用单调栈进行解题,以及在滑动窗口和单调队列中的应用。
摘要由CSDN通过智能技术生成

1. 概念

栈本质是一个线性表,所以它既可以是顺序表也可以是链表,通常为顺序表。与寻常的线性表的不同之处是:栈只可以在端点存入与输出(端点:一般为线性表的尾部,也就是栈顶),不可以随意的
的中间插入输出、头部插入输出。因为这个要求,造就了栈“先进后出,后进先出”的特点。

单调栈: 从栈底元素到栈顶元素呈单调递增或单调递减,栈内序列满足单调性的栈。

2. 解题技巧(我的总结)

1> 单调栈,记录数组/区间中的极值, 单调递增栈维护最小值、次小值… 单调递减栈维护最大值、次大值…

题目说明实现
1438. 绝对差不超过限制的最长连续子数组用单增栈和单减栈分别维护区间的最大最小值(队首),区间不满足要求时尝试从队首移除元素我的提交
239. 滑动窗口最大值用单减栈维护窗口的最大值我的提交

2> 单调栈,隐含历史信息

题目说明实现
456. 132 模式从右到左,单调递减栈,k记录上次被pop出去的值,一定有 栈顶 < k我的提交
84. 柱状图中最大的矩形以每个元素为基准形成的最大矩形面积,记录前面连续大于等于它和后面连续大于等于它的个数,使用单调栈求nextSmaller即可我的提交
1673. 找出最具竞争力的子序列维护单调递增栈,每个元素能挤掉栈尾大于它的,且能挤掉后剩余元素足够k个的我的提交
1856. 子数组最小乘积的最大值依次计算已每个元素为极小值的情况我的提交

3> 括号匹配,从头至尾每个位置累计的左括号数量 > 右括号数量

题目说明实现
301. 删除无效的括号从左到右,判断每个字符删除/不删除,维护leftCnt < rightCnt我的提交
1541. 平衡括号字符串的最少插入次数维护左括号数量始终>=0我的提交

4> 格式校验, 利用栈的特性不断消除元素,(树的先序遍历==栈)

题目说明实现
331. 验证二叉树的前序序列化数值节点当作2,#节点当作0,两个0会消除上一个元素,并再入一个0我的提交
388. 文件的最长绝对路径\t个数表示层数,curLayer < 栈顶,循环pop构建树直至curLayer > 栈顶我的提交

5> 计算表达式,将数值和括号一并入栈讨论

题目说明实现
856. 括号的分数数值和左括号入栈,遇到右括号时按栈顶类型分别处理我的提交
1190. 反转每对括号间的子串字符串和左括号入栈,遇到右括号时将与前一个左括号之间的字符串pop出来,每个字符串都单独的reverse我的提交

3. 更多练习

基础

题目解析答案
496. 下一个更大元素 I对nums2使用单调递减栈求NGE通过
503. 下一个更大元素 II原数组扩一倍,然后使用%运算通过
739. 每日温度保存 NGE 数和对应的下标通过
1019. 链表中的下一个更大节点和 496 一样,只是需要先遍历链表得到数组通过
907. 子数组的最小值之和求 a[i] 的左右边界,两次使用单调递增栈求边界0x3F

进阶

题目解析答案
42. 接雨水栈底到栈顶是递减的,注意凹槽的位置 🔥通过
84. 柱状图中最大的矩形栈底到栈顶是递增的,注意凸起的位置 🔥通过
901. 股票价格跨度单调递减栈,先记下入栈之前数的下标通过
402. 移掉 K 位数字单调递增栈,从头开始遍历,最终去掉前导0通过
1673. 找出最具竞争力的子序列和 402 类似,不需要去掉前导0通过
1081. 不同字符的最小子序列316. 去除重复字母 一样,402 升级版,统计每个字符数目,通过
321. 拼接最大数单调递减栈,数组字典序最大(cpp造轮子),归并通过
1124. 表现良好的最长时间段确切说不是单调栈,思想类似,前缀和+单调栈:找递减序列并且从后往前遍历,前缀和+哈希表:记录 s <= 0 的最小下标0x3F

正向遍历,移除元素或者保留元素使得剩下的数字最小(最大)或者剩下的序列字典序最小(最大)

单调队列

题目解析答案
239. 滑动窗口最大值双端队列,很严格递减的,存储元素比较好理解流程
862. 和至少为 K 的最短子数组前缀和,单调递增的队列0x3F
2373. 矩阵中的局部最大值3*3数据量比较小可以直接遍历,如果比较大可以每行执行滑动窗口求最大,并且每列比较图解

4. 参考

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值