给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
解法 单调栈
思路
上一题是维护一个单调递减的栈,而这里需要维护一个单调递增的栈,当遇到一个比栈顶更小的柱子,就意味着栈顶元素的右边第一个更小已经出现了,此时就可以栈顶柱子为“高”的最大矩形面积。
代码
function largestRectangleArea(heights: number[]): number {
heights.push(0);
let maxArea = 0;
const stack = [];
for (let i = 0; i < heights.length; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
const top = stack.pop()!;
const height = heights[top];
const width = stack.length === 0 ? i : i - stack[stack.length - 1] - 1;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(n)