单调栈
84.柱状图中最大的矩形
解题思路---单调栈
- 维护一个单调递增栈
- 当遇到某个元素比栈顶元素小时, 此时栈顶元素左边和右边可扩展的面积就确定下来了
- 面积计算 :
ans = (r - l - 1) * heights[cur] - 注意: 为了计算边界处的面积, 需要往数组两端添
0 - 重点: 找到当前柱子左边和右边第一个比其小的元素
代码:
class Solution {
// 维护一个单调递增栈
// 重点: 找到当前柱子左边第一个比其矮的, 右边第一个比其矮的
// 则当前柱子能勾勒出来的最大面积为(h[cur] * (r-l-1))
public int largestRectangleArea(int[] arr) {
int ans = 0;
Deque<Integer> deque = new ArrayDeque<>();
// 首尾添0
int[] heights = new int[arr.length + 2];
for (int i = 1; i < arr.length + 1; i++) {
heights[i] = arr[i-1];
}
for (int r = 0; r < heights.length; r++) {
while (!deque.isEmpty() && heights[r] < heights[deque.peek()]) {
int cur = deque.pop();
int l = deque.peek();
ans = Math.max(ans, (r - l - 1) * heights[cur]);
System.out.println(ans);
}
deque.push(r);
}
return ans;
}
}