给出的n个非负整数表示每个直方图的高度,每个直方图的宽均为1,在直方图中找到最大的矩形面积。
在线评测地址:LintCode 领扣
样例 1:
输入:[2,1,5,6,2,3]
输出:10
解释:
第三个和第四个直方图截取矩形面积为2*5=10。
样例 2:
输入:[1,1]
输出:2
解释:
第一个和第二个直方图截取矩形面积为2*1=2。
【题解】
算法:单调栈
思路
- 对于每一个高度h,如果我们能够知道这个高度h作为最低高度的左右边界left和right,那么我们可以很容易的求出以高度h作为高的最大矩形面积S=(right-left+1)*h。
- 我们能够利用单调栈很容易的获取:
1.数组内的某个元素x在这个数组内作为最小元素的最左边界/最右边界
2.数组内的某个元素x在这个数组内作为最大元素的最左边界/最右边界
- 下面以获取元素x在数组A内作为最小元素的左边界为例:
- 我们需要维护一个升序的单调栈。
- 首先我们从左往右依次遍历数组A,假如此时元素为x,当栈为空或者栈顶元素小于x时,我们把x压入栈内,此时我们得到了元素x的左边界=元素x的下标;当栈内元素大于等于x时,我们不断弹出栈内的元素直到栈顶元素小于x,然后我们把x压入栈内,此时我们得到了元素x的左边界=前一个元素的下标+1,因为前一个元素是第一个小于当前元素x的。
- 方便起见,我们直接把元素的下标压入栈内。
- 如果我们需要得到元素x在数组A内作为最小元素的最右边界,我们只需要从右往左遍历数组,维护一个升序的栈即可。反之,如果我们要得到元素x在数组A内作为最大元素的最左边界/最右边界,我们只需要从左往右/从右往左遍历数组,维护一个降序的栈即可。
复杂度
- 假设数组大小为n;
- 空间复杂度O(n);
- 时间复杂度O(n)。
public class Solution {
/**
* @param height: A list of integer
* @return: The area of largest rectangle in the histogram