【leetcode hot 100 84】柱状图中最大的矩形
解法一:单调栈
class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
int area = 0;
// 先做一些特殊判断
if(len==0){
return 0;
}
if(len==1){
return heights[0];
}
// 进入栈后发现后面更短,可以得到当前这个能勾勒的面积 =》 先进后出 符合栈
Deque<Integer> stack = new LinkedList<>();
for(int i=0;i<len;i++){
while(!stack.isEmpty() && heights[i]<heights[stack.peek()]){
// 当前元素严格小于栈顶元素,则可以勾勒当前元素
int height = heights[stack.pop()];
int width;
if(stack.isEmpty()){
// 如果栈是空的,宽度就为i(可以从0开始勾勒)
width = i;
}
else{
width = i-stack.peek()-1; // 这里要多-1,i指的是下一个准备入栈的
}
area = Math.max(area, height*width);
}
stack.push(i); // 当前元素不知道后面情况,无法勾勒,入栈
}
// 处理栈内未处理完的元素
while(!stack.isEmpty()){
// 当前元素严格小于栈顶元素,则可以勾勒当前元素
int height = heights[stack.pop()];
int width;
if(stack.isEmpty()){
// 如果栈是空的,宽度就为i(可以从0开始勾勒)
width = len;
}
else{
width = len-stack.peek()-1;
}
area = Math.max(area, height*width);
}
return area;
}
}
注意:
width = i-stack.peek()-1
这里要多-1,i指的是下一个准备入栈的- 如果栈是空的,宽度就为
i
(可以从0开始勾勒):width = i