分治算法:
通过观察,可以发现,最大面积矩形存在于以下几种情况:
确定了最矮柱子以后,矩形的宽尽可能往两边延伸。
在最矮柱子左边的最大面积矩形(子问题)。
在最矮柱子右边的最大面积矩形(子问题)。
举个例子:
[6, 4, 5, 2, 4, 3, 9]
[6, 4, 5, 2, 4, 3, 9]
这里最矮柱子高度为 2 。以 2 为高的最大子矩阵面积是 2x7=14 。现在,我们考虑上面提到的第二种和第三种情况。我们对高度为 2 柱子的左边和右边采用同样的过程。在 2 的左边, 4 是最小的,形成区域为 4x3=12 。将左边区域再继续分,矩形的面积分别为 6x1=6 和 5x1=5 。同样的,我们可以求出右边区域的面积为 3x3=9, 4x1=4 和 9x1=9 。因此,我们得到最大面积是 16 。具体过程可参考下图:
代码:
public class Solution { public int calculateArea(int[] heights, int start, int end) { if (start > end) return 0; int minindex = start; for (int i = start; i <= end; i++) if (heights[minindex] > heights[i]) minindex = i; return Math.max(heights[minindex] * (end - start + 1), Math.max(calculateArea(heights, start, minindex - 1), calculateArea(heights, minindex + 1, end))); } public int largestRectangleArea(int[] heights) { return calculateArea(heights, 0, heights.length - 1); } }