给定 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最容易想到的是暴力的解法,以当前柱体为高,找到当前柱体左右两边绝对小于当前柱体高度的柱体下标,然后再以下标中间部分为边长,即可算出矩形的面积,以次遍历柱体,计算出最大面积
class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
int area = 0;
//暴力解法
for(int i=0;i<len;i++){
int left=i,right=i;
int bottomWidth = 0;
while(left>=0){
if(heights[left]<heights[i]){
break;
}
left--;
}
while(right<len){
if(heights[right]<heights[i]){
break;
}
right++;
}
bottomWidth = right-left-1;
area = Math.max(area,bottomWidth*heights[i]);
}
return area;
}
}
下面是官方的解法
使用栈空间换时间,遍历数组,然后计算小于栈顶元素时柱体所形成的矩形的面积,高度为栈顶元素高度,底边为当前柱体到次栈顶元素的距离
class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
int area = 0;
//使用栈,保存数组下标
Deque<Integer> stack = new ArrayDeque<>();
//使用哨兵
int[] nums = new int[len+2];
for(int i=0;i<len;i++){
nums[i+1] = heights[i];
}
len+=2;
heights = nums;
stack.addLast(0);
for(int i=0;i<len;i++){
while(heights[stack.peekLast()]>heights[i]){
int height = heights[stack.removeLast()];
int width = i-stack.peekLast()-1;
area = Math.max(area,width*height);
}
stack.addLast(i);
}
return area;
}
}