单调栈

一个简单的数据结构,但是在实际需要时又会经常会忘记

单调栈是一个很简单的数据结构,但我在做单调栈题目的时候经常一时间想不起来要用它。 这是一件很奇怪的事情,因为单调栈确实是一个“看一眼就会的”那种… 之所以出现这样的情况,道理其实很简单:对单调栈凸显的本质还不够了解

单调栈的本质

其实单调栈的本质也很简单,我们用拆词的方法区理解它。

首先是单调,它描述了栈里元素的排列状态, 它是从上到下(或者从下到上)有序排列的这么一个形式。

接下来是,栈代表通常在某个状态下,我们只关心栈的顶端是什么元素。

问题配对

知道本质以后,我们需要反过来去想,单调栈适合去解符合什么样特点的问题。

首先有序的特点约束了单调栈,它只适合去解决一些分析顺序是有序的问题, 也就是说,如果题目要求是随机查询这种,那么在不事先打表的情况下,单调栈是不能解决这类问题的。

另外对栈的单端特点来说,它其实隐含了,类似下一个最大(或者最小)这种信息, 因为我们似乎并不需要去关注栈里的其它内容,所以是在某个状态下,求最值的一种场景。 从另外一方面去看,在只关注最值的情况下,其它部分的值是又被忽略的, 所以单调栈还有着在遍历期间忽略数据噪音的特性 (Ex. 忽略右侧最小的时候,我们并不关系右侧其它较大的值,这时候就可以用单调栈来解决)

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计