84. 柱状图中最大的矩形
解题思路
从左向右依次遍历数组中的元素 如果栈为空或者当前考察的新元素值比栈顶元素大,表明以栈顶元素值为高的矩形面积暂时不能确定,将当前考察的元素入栈,在这个条件下,栈中的元素从栈底到栈顶元素依次递增 栈不为空且当前考察的新元素比栈顶元素小,表示栈顶元素为高的矩形面积是可以确定的,矩形的高就是栈顶元素的值,右侧边界就是当前考察的新元素,左侧边界是栈顶元素的前一个元素,因为在上一步中我们知道栈中元素值从栈底到栈顶是一次递增,所以矩形的宽是当前考察的元素索引和栈顶元素的前一个元素的索引差值减一 栈顶元素出栈之后,还是需要看看当前考察的元素是不是还小于新的栈顶元素,如果是继续出栈,然后计算以其值为高得矩形面积,知道新元素值大于栈顶元素,然后新元素入栈
class Solution { public int largestRectangleArea ( int [ ] heights) { int res = 0 ; Stack < Integer > stack = new Stack < > ( ) ; int [ ] newHeights = new int [ heights. length + 2 ] ; newHeights[ 0 ] = 0 ; newHeights[ newHeights. length - 1 ] = 0 ; for ( int i = 1 ; i < heights. length + 1 ; i++ ) { newHeights[ i] = heights[ i - 1 ] ; } for ( int i = 0 ; i < newHeights. length; i++ ) { while ( ! stack. isEmpty ( ) && newHeights[ i] < newHeights[ stack. peek ( ) ] ) { int cur = stack. pop ( ) ; int curHeight = newHeights[ cur] ; int leftIndex = stack. peek ( ) ; int rightIndex = i; int curWidth = rightIndex - leftIndex - 1 ; res = Math . max ( res, curWidth * curHeight) ; } stack. push ( i) ; } return res; }
}