浅谈单调栈

浅谈单调栈

本篇随笔简单谈一下算法竞赛中的一种数据结构——单调栈。

提前说一声,本篇随笔是一个需要前置知识的随笔。在学习单调栈之前,首先需要读者知道什么是栈。

这需要最基础的数据结构知识。

然后要有不低于初二的数学素养,知道单调这个词的含义。

也就是说正常人都差不多会。


一、单调栈的概念

单调栈。

就是前置知识加和。

单调+栈。

也就是说,对于这个单调栈来讲,栈中的元素是满足单调性的。

那么当然有单调递增栈和单调递减栈等等的分类。

这就是单调栈了。


二、单调栈的应用

单调栈的概念非常简单,那么它的精髓就在于应用,也就是在栈上加了个单调性,它能够支持解决的问题有什么变化。

单调栈的应用是,维护序列中一个数左/右第一个大于/小于它的数。

你可能会说,都是\(O(N)\)复杂度,为什么用单调栈?直接扫描就可以啦?

但是单调栈是用\(O(N)\)的时间,扫描完一整个序列并且处理出所有数左/右第一个大于/小于它的数。

直接扫描的话,复杂度明显是\(O(N^2)\)的。

为什么单调栈可以做到这一点呢?

假设我们要维护一个序列中所有数右侧第一个大于它的数在哪。

那么我们维护单调递减栈,显然,如果新入栈的元素不符合单调栈的性质,就弹栈直到它符合单调栈性质为止。在这个弹栈的过程中,显然地,那些被弹出来的东西都比它小(废话),而且还在它前面,也就是说,如果一个元素可以让这个单调栈出现弹栈操作,那么对于弹出来的所有东西来讲,这个元素就是它们的答案。

这就是单调栈的妙用啦!

其应用还是比较局限的。

posted @ 2020-11-04 16:17  Seaway-Fu  阅读(131)  评论(1编辑  收藏  举报