给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
解题思路:
方案一:
从左到右,遍历每一个矩形高度,当指针到达某一节点K时,以这个节点为高的矩形,必须满足的条件是:左边和右边连续的高度要大于等于该节点的高,通过这种方式可以计算出所有节点为高度的时候的最大的面积,最后算出所有节点高最大面积的最大值即为最大面积。
这种遍历时间复杂度为:n^2
方案二:
思路和第一个类似,只不过借用了栈的思路,顺序遍历每个节点,当高度递增,则分别入栈,直到遇到第一个高度下降的节点,则开始计算栈顶元素为高的矩形,由于栈顶元素的左边和右边都小于栈顶元素,所以面积为heights[top] * [current-(top-1)-1]。计算完毕后出栈top,再计算top-1元素和当前元素相比的高度,如果大于等于当前元素,则top-1为高的面积是:heights[top-1]*[currnet-(top-2)-1],依次类推。知道栈顶元素不再大于当前元素,或者栈已经空了,则继续向后执行。
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(-1);
int max = 0;
for(int i=0;i<heights.length;i++){
while(stack.peek()!=-1&&heights[stack.peek()]>heights[i]){
max = Math.max(max,heights[stack.pop()]*(i-stack.peek()-1));
}
stack.push(i);
}
while(stack.peek()!=-1){
max = Math.max(max,heights[stack.pop()]*(heights.length-stack.peek()-1));
}
return max;
}