给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
思路:
方法一:暴力法,直接两层for循环,代码就不贴出了。
方法二:分治法,我们知道答案无非就三种情况:
-
确定了最矮柱子以后,矩形的宽尽可能往两边延伸。
-
在最矮柱子左边的最大面积矩形(子问题)。
-
在最矮柱子右边的最大面积矩形(子问题)。
class Solution {
public int largestRectangleArea(int[] heights) {
return findAns(heights,0,heights.length-1);
}
private int findAns(int[] heights,int start,int end)
{
if(start>end)
return 0;
int minindex=start;
for(int i=start;i<=end;i++)
if(heights[minindex]>heights[i])
minindex=i;
return Math.max(heights[minindex]*(end-start+1), Math.max(findAns(heights,start,minindex-1), findAns(heights,minindex+1,end)));
}
}
方法三:栈
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> st=new Stack<>();
st.push(-1);
int maxArea=0;
for(int i=0;i<heights.length;i++)
{
while(st.peek()!=-1 && heights[st.peek()]>=heights[i])
maxArea=Math.max(maxArea, heights[st.pop()]*(i-st.peek()-1));
st.push(i);
}
while(st.peek()!=-1)
maxArea=Math.max(maxArea, heights[st.pop()]*(heights.length-st.peek()-1));
return maxArea;
}
}