寻找直方图最大面积
对于 index=i 往左寻找第一个比i低的直方图p 往右寻找第一个比i低的直方图q 则以height[i]为高度的面积为 (q-p+1)*height[i];
直接遍历 超时了,可以用使用dp
新建两个数组 left和right 。 left[i]保存 左边第一个比i低得直方图标签 转移方程有 (设left[0]=-1)
int p = i-1;
while(p!=-1)
{
if(height[p]<height[i])
break;
p = left[p];
}
left[i] = p;
大数据 84 milli secs过的
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int length = height.size();
int* left = new int[length+1];
int* right = new int[length+1];
left[0]=-1;
right[length-1]=length;
for(int i =1;i<length;i++)
{
int p = i-1;
while(p!=-1)
{
if(height[p]<height[i])
break;
p = left[p];
}
left[i] = p;
}
for(int i= length-2;i>=0;i--)
{
int p = i+1;
while(p!=length)
{
if(height[p]<height[i])
break;
p = right[p];
}
right[i]=p;
}
int result = 0;
for(int i =0;i<length;i++)
{
int sum = (i-left[i]+right[i]-1-i)*height[i];
if(sum>result)
result = sum;
}
return result;
}
};