【字节二面算法题】84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

解题思路

  • 从左向右依次遍历数组中的元素
  • 如果栈为空或者当前考察的新元素值比栈顶元素大,表明以栈顶元素值为高的矩形面积暂时不能确定,将当前考察的元素入栈,在这个条件下,栈中的元素从栈底到栈顶元素依次递增
  • 栈不为空且当前考察的新元素比栈顶元素小,表示栈顶元素为高的矩形面积是可以确定的,矩形的高就是栈顶元素的值,右侧边界就是当前考察的新元素,左侧边界是栈顶元素的前一个元素,因为在上一步中我们知道栈中元素值从栈底到栈顶是一次递增,所以矩形的宽是当前考察的元素索引和栈顶元素的前一个元素的索引差值减一
  • 栈顶元素出栈之后,还是需要看看当前考察的元素是不是还小于新的栈顶元素,如果是继续出栈,然后计算以其值为高得矩形面积,知道新元素值大于栈顶元素,然后新元素入栈
class Solution {
    public int largestRectangleArea(int[] heights) {
        // 初始化最终结果0
        int res = 0;
        Stack<Integer> stack = new Stack<>();// 存放的是数组索引

        // 将给定的原数组左右各添加一个元素0  
        int[] newHeights = new int[heights.length + 2];
        newHeights[0] = 0;
        newHeights[newHeights.length - 1] = 0;

        for(int i = 1; i < heights.length + 1; i++){
            newHeights[i] = heights[i - 1];// 将原始数组 复制一下
        }

        // 遍历当前得元素如果大于等于栈顶元素 那么直接入栈
        for(int i = 0; i < newHeights.length;i++){
            // 如果栈不为空  且当前考察的元素值小于栈顶元素值
            // 那么直接以栈顶元素值为高得矩形面积可以确定

            while(!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]){
                // 弹出栈顶元素  存放的是索引
                int cur = stack.pop();

                // 获取栈顶元素对应的高
                int curHeight = newHeights[cur];

                // 栈顶元素弹出之后 新的栈顶元素就是左侧边界
                int leftIndex = stack.peek();

                // 右侧边界就是当前考察得索引
                int rightIndex = i;

                // 计算矩形的宽度
                int curWidth = rightIndex - leftIndex - 1;

                // 计算面积
                res = Math.max(res,curWidth * curHeight);

            }

            // 当前考察索引入栈
            stack.push(i);
        }


        return res;

    }
}

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