代码随想录-2023/08/29

84 阅读1分钟

单调栈

84.柱状图中最大的矩形

解题思路---单调栈

  1. 维护一个单调递增栈
  2. 当遇到某个元素比栈顶元素小时, 此时栈顶元素左边和右边可扩展的面积就确定下来了
  3. 面积计算 : ans = (r - l - 1) * heights[cur]
  4. 注意: 为了计算边界处的面积, 需要往数组两端添0
  5. 重点: 找到当前柱子左边和右边第一个比其小的元素

代码:

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;
    }
}