单调栈

496. 下一个更大元素 I

503. 下一个更大元素 II

739. 每日温度

6227. 下一个更大元素 IV

 

模版归纳

「单调栈」顾名思义就是具有单调性的栈结构,一般常用于找到下一个更大的元素,即当前元素右侧第一个更大的元素

看下面一个例子:2 1 2 4 3

3

我们只看得到比我们更高的元素,所以比我们矮的元素就无关紧要

下面给出「单调栈」的模版:

现在给几个变形

如果我们现在需要找到下一个大于等于的元素,怎么办?很简单只需要修改一个地方即可:

如果我们现在需要找到下一个更小的元素,怎么办?很简单只需要修改一个地方即可:

如果我们现在需要找到上一个更大的元素,怎么办?很简单只需要变换一下遍历顺序即可:

题目实战

上面给出了「单调栈」的模版以及几种不同的变形,下面来几道题目练练手!!

下一个更大元素 I

题目详情可见 下一个更大元素 I

这个题目基本上就是一个模版题,处理上用到了一个小技巧

由于nums1nums2的子集,所以我们先求出nums2的所有下一个更大元素,用Map映射保存一下即可

下一个更大元素 II

题目详情可见 下一个更大元素 II

这个问题加入了一个循环数组的概念,我们处理的方法就是利用 2 倍的数组即可

为了节约空间,我们可以利用「模运算」实现 2 倍数组的效果,而不需要单独开辟空间

每日温度

题目详情可见 每日温度

这个问题需要让我们求与下一个更大元素的间隔,所以我们稍微转变一下栈中存储的内容即可

模版中存储的内容为num[i],这样就损失了下一个更大元素的位置信息。如果我们改为存储「下标」,既保留了位置信息,也可以通过下标获得值

下一个更大元素 IV

题目详情可见 下一个更大元素 IV

这个题目更形象的名字应该是:下下个更大的元素

其实除了用两个栈,还可以用两个堆来实现,堆比栈更好理解,但是原理都是一样的!