解题思路:
本质是求左边第一个比它矮的和右边第一个比它矮的,求出一个面积,然后在这些面积里取最大的
注意,需要在数组前后都补一个0,否则会出现无法计算的情况(单调递增和单调递减数组的情况,走不到计算那一步,或者走到该计算时,需要三个元素但只有两个元素)
class Solution {
public int largestRectangleArea(int[] heights) {
int[] newHeights = new int[heights.length + 2];
newHeights[0] = 0;
newHeights[newHeights.length - 1] = 0;
for (int i = 0; i < heights.length; i++) {
newHeights[i + 1] = heights[i];
}
int max = 0;
Stack<Integer> stack = new Stack<>();
stack.push(0);
for (int i = 1; i < newHeights.length; i++) {
if (newHeights[i] >= newHeights[stack.peek()]) {
stack.push(i);
} else {
while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]) {
int mid = stack.pop();
if (!stack.isEmpty()) {
int left = stack.peek();
int right = i;
int h = newHeights[mid];
int w = right - left - 1;
max = Math.max(max, h * w);
}
}
stack.push(i);
}
}
return max;
}
}