柱状图中最大的矩形。给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
1 |
|
思路一
使用堆栈,堆栈中存储柱子高度的下标。首先我们思考一个问题,假设使用遍历的方法,应该怎样计算当前柱子高度所对应的最大面积,如下所示:
1 |
|
假设现在需要知道第 2 个柱子对应的最大面积,则需要从此柱子向左遍历找到第一个高度比其小的柱子的下标,即 1,以及向右遍历找到第一个高度比其小的柱子的下标,即 4,则第 2 个柱子高度对应的最大面积就为 \(5 \times (4-1-1) = 10\)。即如果使用遍历的方法,需要找到每个柱子对应的左右界,然后更新最大面积。
如果能有方法自动保存每个柱子高度的左界,则只需要知道柱子的右界即可算出该柱子高度对应的最大面积,使用堆栈保存柱子的下标,当当前柱子的高度比栈顶柱子的高度大时,柱子下标入栈,相反,当当前柱子的高度比栈顶柱子高度小时,即此时已经找到栈顶柱子的右界,而栈顶柱子的左界即栈中第二个元素,此时就可以计算栈顶柱子高度对应的最大面积,如下所示:
1 |
|
代码如下:
1 |
|
时间复杂度 \(O(n)\)。
思路二
换一种写法。
1 |
|