原题目
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
题目大意
无
题目分析
方法一:暴力搜索法
从第一个开始,将第一个先作为固定值,往后搜索找每次最小高度,算出该处到起点的宽,乘以它的最小高度,与它上一次的最大面积进行比较,存储最大面积,二层循环结束后,将下一个作为固定值,继续进行以上操作。
方法二:栈
从左边第一个开始,找每个矩形左边大于它的数的个数和右边大于它的个数,找法:每次先判断栈为不为空并且当前值是否小于栈顶元素值,若为空且小于等于栈顶元素,就出栈,让其加上栈顶元素前面大于栈顶元素的个数,用一个数组保存每个元素左边的个数,右边同理。然后用左边的个数加右边的个数加上本身的一个乘以当前的高度。
完整代码
方法一
int Min(int a,int b)
{
if(a<b)
return a;
else return b;
}
int Max(int a,int b)
{
if(a>b)
return a;
else return b;
}
int largestRectangleArea(int* heights, int heightsSize){
if(heightsSize==0)return 0;
int MaxArea=0;
for(int i=0;i<heightsSize;i++)
{
if(i+1<heightsSize&&heights[i]==heights[i+1])continue;
int MinHeight=heights[i];
for(int j=i;j>=0;j--)
{
MinHeight=Min(heights[j],MinHeight);
int HereArea=MinHeight*(i-j+1);
MaxArea=Max(MaxArea,HereArea);
}
}
return MaxArea;
}
方法二,栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int>s1,s2;
vector<int>l(heights.size()),r(heights.size());
for(int i=0;i<heights.size();i++)
{
l[i]=0;
while(!s1.empty()&&heights[i]<=heights[s1.top()])
{
l[i]+=l[s1.top()]+1;
s1.pop();
}
s1.push(i);
}//printf("1\n");
for(int i=heights.size()-1;i>=0;i--)
{
r[i]=0;
while(!s2.empty()&&heights[i]<=heights[s2.top()])
{
r[i]+=r[s2.top()]+1;
s2.pop();
}
s2.push(i);
}//printf("2\n");
int MaxArea=0;
for(int i=0;i<heights.size();i++)
{
MaxArea=max((l[i]+r[i]+1)*heights[i],MaxArea);
}
return MaxArea;
}
};
总结
了解栈的用法