https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
方法
class Solution {
public int largestRectangleArea(int[] heights) {
int maxarea=0;
// 1:暴力求解,定宽度,遍历高度
// // 左边界
// for(int i=0;i<heights.length-1;i++){
// int medheight=Integer.MAX_VALUE;
// // 右边界
// for(int j=i+1;j<heights.length;j++){
// // 区域中的柱高
// for(int k=i;k<j+1;k++){
// medheight=heights[k]<medheight?heights[k]:medheight;
// }
// maxarea=maxarea>medheight*(j-i+1)?maxarea:medheight*(j-i+1);
// }
// }
// 2.暴力求解,定高度,找宽度
// for(int i=0;i<heights.length;i++){
// for(int j=i+1;j<heights.length;j++){
// {
// if(heights[j]<heights[i]){
// maxarea=maxarea>heights[i]*(j-i-1)?maxarea:heights[i]*(j-i-1);
// }
// }
// }
// }
// 3.单调栈的思想方式
Stack<Integer> stack=new Stack<>();
stack.push(-1);
int[] heights1=new int[heights.length+1];
heights1[heights1.length-1]=-1;
System.arraycopy(heights,0,heights1,0,heights.length);
for(int i=0;i<heights1.length;i++){
// 高柱子入栈
while(stack.peek()!=-1&&heights1[stack.peek()]>=heights1[i]){
int h=heights1[stack.pop()];
int w=(i-1-stack.peek());
maxarea=maxarea>h*w?maxarea:h*w;
}
stack.push(i);
}
while(stack.peek()!=-1){
int w=stack.peek();
maxarea=Math.max(maxarea,heights1[stack.pop()]*(w-stack.peek()));
}
return maxarea;
}
}
结果