给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
方法一 暴力
public int largestRectangleArea1(int[] heights) {
int size = heights.length;
if(size == 0) {
return 0;
}
int max = 0;
for(int i = 0;i < size; i++) {
int len = 1;
int b = i;
while(b>0 &&heights[i] <= heights[b-1]) {
b--;
len++;
}
b = i;
while(b < size - 1 &&heights[i] <= heights[b+1]) {
b++;
len++;
}
int c = len * heights[i];
if(c > max) {
max = c;
}
}
System.out.println(max);
return max;
}
方法二 单调栈+哨兵
public int largestRectangleArea(int[] heights) {
int len = heights.length;
if(len == 0) {
return 0;
}
if(len == 1) {
return heights[0];
}
int area = 0;
//哨兵
int[] newHeights = new int[len+2];
for(int i = 0;i < len;i++) {
newHeights[i+1] = heights[i];
}
len += 2;
heights = newHeights;
Stack<Integer> stack = new Stack<Integer>();
stack.push(0);
for (int i = 1; i < len ; i++) {
while ( heights[stack.peek()] > heights[i]) {
// 当前数据比前一个数据小
int height = heights[stack.pop()];// 找到能确定面积的高度
int width = i - stack.peek() - 1;// (不包括i)
area = Math.max(area, width * height);
}
stack.push(i);
}
System.out.println(area);
return area;
}