day60 ● 84.柱状图中最大的矩形

112 阅读2分钟

一、问题描述 给定一个柱状图,每个柱子的宽度都为1,求这个柱状图中最大的矩形的面积。

二、解决思路 这个问题可以使用单调栈来解决。单调栈是指栈中元素单调递增或单调递减。具体思路如下:

1.维护一个单调递增的栈。遍历每个柱子,如果当前柱子比栈顶元素矮,则弹出栈顶元素,直到当前柱子大于等于栈顶元素。弹出栈顶元素时,以该元素为高度,计算以该元素为右边界的最大矩形面积。 2.遍历完所有柱子后,如果栈中还有元素,则以该元素为右边界,计算以该元素为高度的最大矩形面积。取所有计算出的面积的最大值即是柱状图中最大的矩形面积。

三、代码实现

public int largestRectangleArea(int[] heights) {
    Stack<Integer> stack = new Stack<>();
    int maxArea = 0;
    for (int i = 0; i <= heights.length; i++) {
        int h = (i == heights.length ? 0 : heights[i]);
        if (stack.isEmpty() || h >= heights[stack.peek()]) {
            stack.push(i);
        } else {
            int tp = stack.pop();
            maxArea = Math.max(maxArea, heights[tp] * (stack.isEmpty() ? i : i - 1 - stack.peek()));
            i--;
        }
    }
    return maxArea;
}

四、复杂度分析 时间复杂度为O(n),空间复杂度为O(n)。其中,n为柱子的数量。

五、总结

单调栈是解决某些问题的高效算法之一。在解决本题时,我们维护了一个单调递增的栈,遍历每个柱子,如果当前柱子比栈顶元素矮,则弹出栈顶元素,直到当前柱子大于等于栈顶元素。弹出栈顶元素时,以该元素为高度,计算以该元素为右边界的最大矩形面积。遍历完所有柱子后,如果栈中还有元素,则以该元素为右边界,计算以该元素为高度的最大矩形面积。取所有计算出的面积的最大值即是柱状图中最大的矩形面积。