Bootstrap

力扣 LeetCode 84. 柱状图中最大的矩形(Day25:单调栈)

解题思路:

本质是求左边第一个比它矮的和右边第一个比它矮的,求出一个面积,然后在这些面积里取最大的

注意,需要在数组前后都补一个0,否则会出现无法计算的情况(单调递增和单调递减数组的情况,走不到计算那一步,或者走到该计算时,需要三个元素但只有两个元素)

class Solution {
    public int largestRectangleArea(int[] heights) {
        int[] newHeights = new int[heights.length + 2];
        newHeights[0] = 0;
        newHeights[newHeights.length - 1] = 0;
        for (int i = 0; i < heights.length; i++) {
            newHeights[i + 1] = heights[i];
        }

        int max = 0;
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        for (int i = 1; i < newHeights.length; i++) {
            if (newHeights[i] >= newHeights[stack.peek()]) {
                stack.push(i);
            } else {
                while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]) {
                    int mid = stack.pop();
                    if (!stack.isEmpty()) {
                        int left = stack.peek();
                        int right = i;
                        int h = newHeights[mid];
                        int w = right - left - 1;
                        max = Math.max(max, h * w);
                    }
                }
                stack.push(i);
            }
        }
        return max;
    }
}

;