单调栈问题

1:单调栈的概述

首先先了解一下什么是单调栈(Monotonic stack),他有什么用途,我们在解决什么问题的时候可以用到单调栈? 我们都知道栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。单调栈顾名思义就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。单调栈一般用来解决比当前元素更大或者更小的下一个元素问题,也即是 next greater element 或者next smaller element 相关问题,因为下一个更大或者下一个更小的元素正好符合栈的基本定义,再加上单调性,就可以在O(n)时间复杂度内解决这类问题了,LeetCode中比较典型的单调栈问题如下。

2:LeetCode相关经典的题目

第一部分:

402. 移掉 K 位数字

316. 去除重复字母

321. 拼接最大数

84. 柱状图中最大的矩形

85. 最大矩形

第二部分:

456. 132 模式

496. 下一个更大元素 I

503. 下一个更大元素 II

3:解决单调栈问题的一般代码模板

for _, v := range num {
   //当有该元素入栈时,不符合栈中单调性的时候,弹出栈顶元素,一直到满足单调性为止
for k > 0 && !stack.isEmpty() && v < stack.peek() {
k--
stack.pop()
}
stack.push(v)
}

4:解决单调栈问题的一般解题思路

首先,我们要明白单调栈栈可以解决什么样的问题,这个虽然已经在开头说过了,再次还要重点强调一下,单调栈是为了解决下一个比当前元素大或者小的问题的,那么当我们遇到一个类似问题的时候我们要对比着单调栈已有的性质和解决方案分析问题,仔细的分析一下我们遇到的问题是否符合单调栈相关的性质(如果这个分析不出来的话,那就说明我们对单调栈相关的问题还不是太熟悉,按照LeetCode上面的问题类型多加练习和总结,一般在遇到类似相关问题就可以分析出此类问题应该用什么样的方式去解决),如果确定是属于单调栈的问题那么,我们就可以努力往单调栈的思路上去靠,然后利用单调栈的性质去解决此类问题。

当然,我们解决问题的时候可能问题涉及的不只有单调栈这一个知识点,这就需要我们使用单调栈结合其他的知识来解决问题了,然而能熟练使用单调栈解决问题也不是解决一道或者两道问题就能深刻理解的,那么后续就需要我们多加练习和总结来巩固我们所学的知识点,为利用单调栈和其他知识点结合解决更复杂的问题夯实基础。

(以上的LeetCode中的问题比较经典,都是和单调栈相关的问题,还有和利用其他知识综合解决的问题,最好是按照顺序做一下,题解LeetCode已经写的非常的详细了,再次不多叙述关于具体题目的题解,本篇只是文档单纯的说一下关于单调栈问题的一些总结,具体的题解和参考LeetCode的官方题解)

你可能感兴趣的:(单调栈问题)