No.84 Largest Rectangle in Histogram

84. 柱状图中最大的矩形 - 力扣(LeetCode) (leetcode-cn.com)

现在我们从头开始讲,如果要求只能遍历一次,那么如何求最大面积?
我想到一个思路,那就是先把能完全包含各个柱状图的矩形的最大面积求出来,然后求出其中最大值即可。以例题来说就是

能完全覆盖第0个柱子的最大矩形

 

 

能完全覆盖第1个柱子的最大矩形

 

 


能完全覆盖第2个柱子的最大矩形

 

 


能完全覆盖第3个柱子的最大矩形

 

 

能完全覆盖第4个柱子的最大矩形

 

能完全覆盖第5个柱子的最大矩形

 public int largestRectangleArea(int[] heights) {
        int maxNum = heights[0];
        int len = heights.length;
        int[] newheight = new int[len + 2];
        newheight[0] = 0;
        newheight[len + 1] = 0;
        for (int i = 0; i < len; i++) {
            newheight[i + 1] = heights[i];
        }
        heights = newheight;   // 给height数组的首尾各添加一个0
        Deque<Integer> idx_stack = new ArrayDeque<>();

        idx_stack.addLast(0);
        for (int i = 1; i <= len+1; i++) {
            if (heights[i] > heights[idx_stack.getLast()]) {    // heights[i]比栈顶元素大,则入栈
                idx_stack.addLast(i);
            } else if (heights[i] == heights[idx_stack.getLast()]) {
                idx_stack.removeLast();
                idx_stack.addLast(i);
            } else {  // 当heights[i]的值比栈顶元素的小,则开始计算当前以当前栈顶为高的矩形面积
                while (heights[i] < heights[idx_stack.getLast()]) {
                    int curIdx = idx_stack.getLast();
                    idx_stack.removeLast();   // 只要栈顶元素比将入栈的元素heights[i]要大, 就需要讲其抛出,并计算其面积
                    int right = i;
                    int left = idx_stack.getLast();
                    int width = right - left - 1;
                    maxNum = Math.max(maxNum, width * heights[curIdx]);   //heights中的矩形都以左下角为索引
                }
                idx_stack.addLast(i);
            }
        }
        return maxNum;
    }

 

 

如此这般,就能够覆盖所有分支而又不遗漏,将这6个矩形的面积比较下就知道最大面积了。

思路:单调栈,维护一个递增的栈

           对于初始的高度数组heights[], 遍历其中的元素,按照一定的规则将元素压入栈,规则就是想入栈的元素heights[i],需要比栈顶元素更大,

这是为了给当前的栈顶元素卡住位置,如果想要入栈的heights[i]比栈顶元素要小,那么就可以开始计算栈顶元素为高的最大面积。

 

注意:heights[]开头和结尾各加一个0,卡住首尾矩阵。最后一轮相当于高度为0的元素一直卡在最后,把前面剩余的单调递增矩阵一波带走。

 

 

 

           

posted @ 2021-10-12 22:05  CharonKK  阅读(45)  评论(0)    收藏  举报