给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例: 输入: [2,1,5,6,2,3] 输出: 10
解法1:
遍历数组,每找到一个局部峰值,然后向前遍历所有的值,算出共同的矩形面积,每次对比保留最大值.
public int largestRectangleArea(int[] heights) {
int res = 0;
for(int i = 0; i < heights.length; i++){
if(i + 1 < i && heights[i] <= heights[i + 1]){
continue;
}
int minH = heights[i];
for(int j = i; j >=0; j--){
minH = Math.min(minH, heights[j]);
int area = minH * (i - j + 1);
res = Math.max(res, area);
}
}
return res;
}
解法2:单调栈
public int largestRectangleArea(int[] heights) {
if(heights == null || heights.length == 0) return 0;
int res = 0;
Stack<Integer> s = new Stack<>();
for(int i = 0; i < heights.length; i++){
while(!s.isEmpty() && heights[i] <= heights[s.peek()]){
int j = s.pop();
int k = s.isEmpty() ? -1 : s.peek();
int curArea = (i - k - 1) * heights[j];
res = Math.max(res, curArea);
}
s.push(i);
}
while(!s.isEmpty()){
int j = s.pop();
int k = s.isEmpty() ? -1 : s.peek();
int curArea = (heights.length - k - 1) * heights[j];
res = Math.max(res, curArea);
}
return res;
}