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的元素一直卡在最后,把前面剩余的单调递增矩阵一波带走。

浙公网安备 33010602011771号