1. 题解
题目
链接🔗:84. Largest Rectangle in Histogram
这道题和42. Trapping Rain Water有些相像,但是42题求的是能围住的最大面积,而本题求的是连成的矩阵的最大面积,因而在计算面积的方法上有些许不同。85. Maximal Rectangle就是在本题基础上的变式,通过一系列变化可以使用本题方法。
分析
简单分析可以知道最大矩形面积有两种情况:
- 当前矩形的高度heights[i] * 1
- 当前矩形的高度heights[i] * (向右第一个比当前高度小的矩形的index - 向左第一个比当前高度小的矩形的index - 1)
经过进一步归纳发现,第一种情况其实包含于第二种情况。
解法一:DP
根据上述描述,如果我们每次遍历到一个index,就可以知道左右需要的index,就可以直接计算最大面积。所以本题应该构建两个数组,来存储每一个index向左第一个较小矩形的index和向右第一个较小矩形的index的数组。
int[] leftLess = new int[heights.length]; // store the left index - i that heights[i] <= heights[current]
int[] rightLess = new int[heights.length]; // same to the leftLess
leftLess[0] = -1;
rightLess[heights.length - 1] = heights.length;
// leftLess
for (int i = 1; i < heights.length;