代码随想录算法训练营第六十天|84.柱状图中最大的矩形

代码随想录 (programmercarl.com)

84.柱状图中最大的矩形

方法一:暴力解法

寻找每个柱子左边和右边第一个比他矮的,确定宽度,高度,最终得出面积

超时了,时间复杂度是O(n^2)。

方法二:双指针法

时间复杂度是O(n)

方法三:单调栈法

寻找元素第一个比他大或比他小的元素,都可以使用单调栈的思路

接雨水求的是右边第一个比他大的元素====递增的单调栈

而本题求的是右边第一个比他小的元素====递减的单调栈

注意:需要在 height数组前后各加一个元素0

left:表示矩形左边第一个比他小的数字;right:表示矩形右边第一个比他小的数组

矩形面积s = (right - left - 1) * w;

class Solution {
    public int largestRectangleArea(int[] heights) {
        int[] newHeight = new int[heights.length + 2];
        System.arraycopy(heights, 0, newHeight, 1, heights.length);
        //该函数意义:public static void arraycopy(Object src,
        //                             int srcPos,
        //                             Object dest,
        //                             int destPos,
        //                             int length)
        //src:源数组;	srcPos:源数组要复制的起始位置;
        //dest:目的数组;	destPos:目的数组放置的起始位置;	length:复制的长度。
        //注意:src and dest都必须是同类型或者可以进行转换类型的数组.
        newHeight[heights.length + 1] = 0;
        newHeight[0] = 0;
        //给原数组首尾加0
        int res = 0;

        Stack stack = new Stack<>();
        stack.push(0);

        for (int i = 1; i < newHeight.length; i++) {
            while (newHeight[i] < newHeight[stack.peek()]){
                //因为首尾加了0,所以栈不可能为空,省略判断
                int mid = stack.peek();
                stack.pop();
                int h = newHeight[mid];
                int left = stack.peek();
                int right = i;
                int w = right - left - 1;
                res = Math.max(res, h * w);
            }
            stack.push(i);
        }
        return res;
    }
}

你可能感兴趣的:(算法,java,leetcode,数据结构)