84.柱状图中最大的矩形
https://leetcode.cn/problems/largest-rectangle-in-histogram/submissions/
栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度
找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!
如下三种情况:
情况一:当前遍历的元素heights[i]小于栈顶元素heights[st.peek()]的情况
情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.peek()]的情况
情况三:当前遍历的元素heights[i]大于栈顶元素heights[st.peek()]的情况
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> st = new Stack<Integer>();
int[] newheights = new int[heights.length + 2];
newheights[0] = 0;
newheights[newheights.length -1] =0;
int sum =0;
for(int i=0;i<heights.length;i++){
newheights[i+1] = heights[i];
}
st.push(0);
heights = newheights;
for(int i=1;i<heights.length;i++){
if(heights[i] > heights[st.peek()]){
st.push(i);
}else if(heights[i] == heights[st.peek()]){
st.pop();
st.push(i);
}else{
while(heights[i] < heights[st.peek()]){
int mid = st.peek();
st.pop();
int left = st.peek();
int right =i;
int w= right -left -1;
int h = heights[mid];
sum = Math.max(sum,w*h);
}
st.push(i);
}
}
return sum;
}
}