给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
之前在CCF中遇到过,纯暴力解法,但是在LC中看到单调栈的解法后,感觉自己好low啊
代码如下
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>() ;
stack.push(-1) ;
int l = heights.length ;
int maxArea = 0 ;
for (int i=0 ; i<l ; i++){
//栈顶元素对应的高度 大于等于 i对应的高度
//柱状图呈现下降趋势后开始更新maxArea
//stack的目的保证柱状图始终呈现上升趋势
while(stack.peek() != -1 && heights[i] <= heights[stack.peek()]){
//大于i对应高度的位置出栈
//area = h*l ; h = heights[top] 、 l = [top , i-1] 长度
maxArea = Math.max(maxArea , heights[stack.pop()]*(i-stack.peek()-1)) ;
}
//当前位置入栈
stack.push(i) ;
}
//我称之为{结算}
while (stack.peek() != -1){
maxArea = Math.max(maxArea, heights[stack.pop()] * (heights.length - stack.peek() -1));
}
return maxArea ;
}
单调栈
何为单调栈
单调栈就是栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作。并且单调栈维护的时间复杂度是O(n)级的复杂度,因为所有元素只能进栈一次,并且出栈后不能再次进栈。