LeetCode:84. 柱状图中最大的矩形
单调栈,因为是计算面积, 需要考虑高度以及宽度, 类似接雨水的单调栈解法
按照从小到大维护一个单调栈,当遇到下一个的高度小于栈顶位置的高度的时候, 说明到达栈顶的右边界了, 然后进行结算。
为了代码简便,拷贝给定数组, 在柱体数组的头和尾加了两个高度为 0 的柱体。
AC Code
class Solution {
public int largestRectangleArea(int[] h) {
int len = h.length;
int[] tmp = new int[len + 2];
// arraycopy 的参数 源数组、开始位置, 目的数组、开始位置, 复制长度
System.arraycopy(h, 0, tmp, 1, len);
// 单调栈, 存取下标 -> 作为宽
int ans = 0;
Deque<Integer> stack = new ArrayDeque<>();
for(int i = 0; i < tmp.length; i++) {
// 不为空
while(!stack.isEmpty() && tmp[i] < tmp[stack.peek()]) {
int idx = stack.pop();
int b = (i - stack.peek() - 1);
int area = tmp[idx] * b;
ans = Math.max(ans, area);
}
stack.push(i);
}
return ans;
}
}