1. 问题分析
首先直观考虑的话该题可以通过遍历的方法去计算,需要n(n+1)/2次计算即可求取矩形面积的最大值,达到o(n*n)的时间复杂度。
在此基础上可以做进一步的优化,可知若直方图中高度的数值是依次增加的,则最大矩形面积必然是随数组下标增加而增大的(宽度变大而高度不会减小),这种情况下的最大矩形面积可以通过矩阵高度ceiling从高往低的一次遍历来求得,ceiling下降则宽度width必须增加才有可能获得一个更大的矩形,ceiling和width都很小的情形就可以不必计算了。
若直方图中高度的数值出现递减,我们依然可以根据此思路利用栈构造出一个递增的形式,获得一个复杂度o(n)的算法。这种思路直观上来讲等同于在非递增时先计算凸出部分的最大矩形面积,然后削掉直方图中的凸出部分,使其变为递增的情形。
由以上思路可以写出如下代码,依次遍历height数组中元素,栈中存储height数组的下标值,使得栈中下标所代表的高度值依次递增,每次出栈的值为当前栈中高度最高数值的下标。该算法的重点在于ceiling和width的求取。
import java.util.Stack;
public class LargestRectangleInHistogram {
public int largestRectangleArea(int[] height) {
//stack存储height数组的下标
Stack<Integer> stack = new Stack<>();
//最大面