思路
我们将数组的左右两边都加上0,然后遍历数组元素,遍历到第i个元素的时候,找到左边第一个比他小的元素,然后找到右边第一个比他小的元素,然后我们计算出相应的宽和高,就可以得到最终的结果了。
代码
class Solution {
public int largestRectangleArea(int[] heights) {
List<Integer> list = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
list.add(0);
int ans = 0;
for(int i=0;i<heights.length;i++)
list.add(heights[i]);
list.add(0);
for(int i=0;i<list.size();i++){
while(!stack.isEmpty() && list.get(i) < list.get(stack.peek())){
int bottom = list.get(stack.pop());
if(stack.isEmpty()) break;
int left = stack.peek();
int right = i;
int h = bottom;
int w = right-left-1;
ans = Math.max(ans,h*w);
}
stack.push(i);
}
return ans;
}
}