参考题解:单调栈入门,使用单调栈快速寻找边界
这道题可以分为两种思路:
- 限定高度。
- 限定宽度。
其中,限定宽度的复杂度是 O(n^2),限定高度复杂度是 O(n),因此选择,固定每个柱的高度,向左右延伸,看看有没有比最大值还要大的矩形。
单调栈是一种很适合这里的数据结构,如果新的元素比栈顶元素大,入栈。如果比栈顶元素小,就一个个弹出,直到栈没有元素或者新元素比栈顶元素大。
- 元素出栈时,说明
新元素
是出栈元素向后
找第一个比其小的元素。 - 元素出栈后,说明
新栈顶元素
是出栈元素向前
找第一个比其小的元素。
代码模板如下:
Stack<Integer> s = new Stack<>();
for (int i = 0; i < height.length; ++i) {
while (!s.isEmpty() && height[s.peek()] > height[i]) {
s.pop();
}
s.push(i);
}
对应于这道题,就要在出栈时进行计算,以比较矩阵大小。
代码如下:
class Solution {
public int largestRectangleArea(int[] heights) {
Integer ans = 0;
int[] height = new int[heights.length + 2];
height[0] = 0;
height[height.length - 1] = 0;
for (int i = 1; i < height.length - 1; ++i) {
height[i] = heights[i - 1];
}
Stack<Integer> s = new Stack<>();
for (int i = 0; i < height.length; ++i) {
while (!s.isEmpty() && height[s.peek()] > height[i]) {
int cur = s.pop();
int left = s.peek() + 1;
int right = i - 1;
Integer temp = (right - left + 1) * height[cur];
ans = temp.compareTo(ans) == 1 ? temp : ans;
}
s.push(i);
}
return ans;
}
}