力扣-单调栈想法
作为力扣"接雨水"的知识基础,单调栈不可谓不重要,因此,本博客尝试能把单调栈讲得更为细致一点,讲得更有头有尾一些。
首先,要明确的一点是,单调栈一种新的数据结构吗?当然,栈是一种数据结构,但单调栈绝不是一种新的数据结构,它是一种数据的表现形式,栈中的所有数据单调递增或者单调递减(这也是程序员思考逻辑的体现)。
单调栈最基础的应用场景为给定一个数组,求某元素的右侧第一个大于该元素的元素位置。我们还是来说一下大多数人的思考方法:暴力,两个for循环。我会把这种思考方式称为:谁是我的。在力扣上,这种形式的代码提交一般都会超时。超时怎么办?空间换时间。这五个字谁都知道,但具体怎么运用却是个难点。用空间换时间,本质就是将一些有用信息事先存储,但什么是有用信息?
我们关注以下的一种情况:
在暴力循环中,我们需要对每一个元素,找到右侧第一个大于它的元素,但如果是上述样子,其中左侧3个元素都是单调递减的,而且最右侧的元素是大于左边三个元素的,因此,我们可以确定右边的元素是左边三个元素的所谓的"右侧第一个大于它的元素" 这样,我们将问题从"谁是我的"转换为"我是谁的"。
我们希望用一种数据结构将这种单调递减的元素存储起来,所以,我们用到了单调栈。