力扣84.柱状图中最大的矩形
题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/
思路
本题和接雨水相似,不同的是找的是比当前柱子小的元素。那么在维护单调栈时,需要维护的是从栈顶到栈底递减的单调栈。
(1)当遍历元素大于等于栈顶元素时,压入栈中;
(2)当遍历元素小于栈顶元素时,开始操作。
需要对数组两头进行扩容。
完整代码
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> st = new Stack<>(); // 存着下标,计算的时候用下标对应的柱子高度
int [] newHeights = new int[heights.length + 2];
newHeights[0] = 0;
newHeights[newHeights.length - 1] = 0;
for (int index = 0; index < heights.length; index++){
newHeights[index + 1] = heights[index];
}
heights = newHeights;
st.push(0);
int res = 0;
for (int i = 1; i < heights.length; i++) {
if (heights[i] > heights[st.peek()]) { // 情况一
st.push(i);
} if (heights[i] == heights[st.peek()]) { // 情况二
st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。
st.push(i);
} else { // 情况三
while (heights[i] < heights[st.peek()]) { // 注意这里是while
int mid = st.peek();
st.pop();
int left = st.peek();
int right = i;
int h = heights[mid];
int w = right - left - 1; // 注意减一,只求中间宽度
res = Math.max(h * w,res);
}
st.push(i);
}
}
return res;
}
}