柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
解题思路
- 1、使用单调栈解决问题。
- 2、遍历柱状图的高度数组,对于每个柱子的高度:
-
如果栈为空或者当前柱子的高度大于等于栈顶柱子的高度,则将当前柱子的索引入栈;
-
否则,不断弹出栈顶元素,并计算以弹出元素为高度的矩形的面积,更新最大面积值。
- 3、在遍历完成后,如果栈中仍有柱子,则按照右边界为数组长度计算矩形面积。
关键是理解思路,为什么需要这么做,参考下面图解理解
查看leetcode图解方法二:以空间换时间,可以使用的数据结构是栈
Java实现
public class LargestRectangleInHistogram {
public int largestRectangleArea(int[] heights) {
int n = heights.length;
Stack<Integer> stack = new Stack<>();
int maxArea = 0;
for (int i = 0; i <= n; i++) {
//如果当前柱子的高度小于栈顶柱子的高度,说明找到了一个可能构成矩形的位置
//stack不为空且i == n,证明剩下的栈里面都是递增的数据
while (!stack.isEmpty() && (i == n || heights[i] < heights[stack.peek()])) {
//前一个柱子高度
int height = heights[stack.pop()];
//栈为空就是没有数据高度比当前数据低,宽度就是数组坐标
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}
public static void main(String[] args) {
LargestRectangleInHistogram solution = new LargestRectangleInHistogram();
int[] heights = {2, 1, 5, 6, 2, 3};
int maxArea = solution.largestRectangleArea(heights);
System.out.println("Max area: " + maxArea); // Output: 10
}
}
时间空间复杂度
-
时间复杂度:O(n),其中n为柱状图的高度数组heights的长度。因为需要遍历柱状图的高度数组一次。
-
空间复杂度:O(n),使用了一个额外的栈来存储柱子的索引。