给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/0ynMMM
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int largestRectangleArea(int[] heights) {
if(heights == null || heights.length == 0){
return 0;
}
int len = heights.length;
int left = 0;
int right = 0;
Stack<List<Integer>> stack = new Stack<>();
int size = 0;
for(int i = 0;i < len;i++){
while(!stack.isEmpty() && heights[stack.peek().get(0).intValue()] > heights[i]){
List<Integer> list = new ArrayList<>();
list = stack.pop();
for(Integer j : list){
left = !stack.isEmpty() ? stack.peek().get(stack.peek().size() - 1) : -1;
right = i;
size = size >= heights[j] * (right - left - 1) ? size : heights[j] * (right - left - 1);
}
}
if(!stack.isEmpty() && heights[stack.peek().get(0).intValue()] == heights[i]){
stack.peek().add(Integer.valueOf(i));
}
else{
List<Integer> list = new ArrayList<>();
list.add(Integer.valueOf(i));
stack.push(list);
}
}
while(!stack.isEmpty()){
List<Integer> list = new ArrayList<>();
list = stack.pop();
for(Integer j : list){
left = !stack.isEmpty() ? stack.peek().get(stack.peek().size() - 1) : -1;
right = len - 1;
size = size >= heights[j] * (right - left) ? size : heights[j] * (right - left);
}
}
return size;
}
}