给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分治法
问题可分为三种情况:
1.找出最短柱子,矩形的宽尽可能往两边延伸
2.在最短柱子的左边找出最大面积
3.在最短柱子的右边找出最大面积
举例[2,1,5,6,2,3]
最短柱子为1,宽度为6,面积1*6=6
对高度为1的左右两边采取同样的过程
1的左边,形成面积2*1=2;1的右边,最短柱子2,形成面积2*4=8,以此类推,2的左边形成5*2=10,6*1=6,2的右边3*1=3
最终得到面积最大值5*2=10
class Solution {
public int largestRectangleArea(int[] heights) {
return calculateMaxArea(heights, 0, heights.length - 1);
}
private int calculateMaxArea(int[] heights, int left, int right) {
if (left > right) return 0;
int minIndex = left;
//求出最短柱子
for (int i = left; i <= right; i++) {
if (heights[i] < heights[minIndex]) {
minIndex = i;
}
}
return Math.max(heights[minIndex] * (right - left + 1),
Math.max(calculateMaxArea(heights, left, minIndex - 1), calculateMaxArea(heights, minIndex + 1, right)));
}
}