一种很好理解的思路 (这种思路超出时间限制,最后一个测试用例过不了)就是以每个位置的高度作为高 向两边延伸(只有它左边或者右边位置的高度不大于当前位置的高度才符合条件)找最大宽度让这个宽度乘以高度就可以得到以当前位置的高度为高能做出的最大的矩形面积,所以我们遍历数组找出每个位置的最大矩形面积,它们中的最大值即为我们最后要求解的值
int largewide(int* heights, int heightsSize,int index)//找到以某一个位置的高度向两边延伸可以得到的矩形的最大面积
{
int i=index-1,j=index+1;
int length=1;
while(i>=0&&heights[i]>=heights[index]&&j<heightsSize&&heights[j]>=heights[index])
{
i-=1;
j+=1;
length+=2;
}
while(i>=0&&heights[i]>=heights[index])
{
i-=1;
length+=1;
}
while(j<heightsSize&&heights[j]>=heights[index])
{
j+=1;
length+=1;
}
return heights[index]*length;
}
int largestRectangleArea(int* heights, int heightsSize){
int i=0;
int area=0,a=0;
for(i=0;i<heightsSize;i++)
{
a=largewide(heights, heightsSize,i);
if(a>area)
area=a;
}
return area;
}
分治法以下方法来源于leetcode官方题解
int divide(int* heights,int low,int high)
{
if(low>high)
return 0;
if(low==high)
{
return heights[low];
}
int min=heights[low];//存放最小高度
int mini=low;//存放最小高度的下标
int i=0;
int area=0,a=0,b=0,max=heights[low];
for(i=low;i<=high;i++)
{
if(heights[i]<min)
{
min=heights[i];
mini=i;
}
max=max>heights[i]?max:heights[i];
}
area=heights[mini]*(high-low+1);
if(max==min)
return area;
if (low <= mini - 1) {
int area1 = divide(heights, low, mini - 1);
area = area > area1 ? area : area1;
}
if (mini + 1 <= high) {
int area2 = divide(heights, mini + 1, high);
area = area > area2 ? area : area2;
}
return area;
}
int largestRectangleArea(int* heights, int heightsSize){
return divide( heights,0,heightsSize-1);
}
单调栈以下图片来源于leetcode官方提解
说一点自己的理解吧 为什么这个栈中的元素一定要单调递增: 我们知道一旦一个矩形周围出现了一个比它更矮的矩形那等于说它的宽度就不能再扩展了 即它的面积不可能变的更大了 那就把它的宽度乘以高度求出面积,更新最大面积 并把它弹出栈
int divide(int* heights,int low,int high)
{
if(low>high)
return 0;
if(low==high)
{
return heights[low];
}
int min=heights[low];//存放最小高度
int mini=low;//存放最小高度的下标
int i=0;
int area=0,a=0,b=0,max=heights[low];
for(i=low;i<=high;i++)
{
if(heights[i]<min)
{
min=heights[i];
mini=i;
}
max=max>heights[i]?max:heights[i];
}
area=heights[mini]*(high-low+1);
if(max==min)
return area;
if (low <= mini - 1) {
int area1 = divide(heights, low, mini - 1);
area = area > area1 ? area : area1;
}
if (mini + 1 <= high) {
int area2 = divide(heights, mini + 1, high);
area = area > area2 ? area : area2;
}
return area;
}
int largestRectangleArea(int* heights, int heightsSize){
return divide( heights,0,heightsSize-1);
}
来源:CSDN
作者:会写代码的小螃蟹
链接:https://blog.csdn.net/qq_44822951/article/details/103637022