2020/05/30 单调栈的练习题目
引言
单调栈的题目是比较技巧的一类题目,涉及到什么样的问题考虑采用单调栈;单调的选取,选择单调增还是单调减;单调栈的维护;以及如何利用单调性解决问题。
柱形图问题
一种典型的单调栈问题。之所以思考采用单调栈的方法是因为计算每个部分的面积与最大最小的关系有关。
在计算面积时候回去寻找当前长方形的左右大于该高度的连续长方形。因此采用单调栈的话,我们需要找一个单调增的栈,保证该长方形左侧连续无更高的长方形。并且在每次被弹出时计算该高度的长方形的最大宽度。因为被弹出时说明右侧最大连续高长方形也已经被找到。因此可以完整的计算面积。
这类问题有一个细节,需要补充两端的0,保证封闭整个数组,因为只有在弹出时才会计算面积,因此右端补零保证全部弹出;左端补0保证计算时候能找寻到左端点。
class Solution(object):
def largestRectangleArea(self, heights):
## 维护一个单增的栈
heights = [0]+heights+[0]
stack