您的位置:首页 > 编程语言

庞果英雄会---寻找直方图中面积最大的矩形---编程挑战

2013-07-05 21:45 411 查看
题目链接:http://hero.pongo.cn/home/index

这里给出一个线性算法和一个平方算法,第一个算法没有问题,挑战成功。第二个算法测试了很多数据但是失败,有大神路过,恳请点拨。

#include <iostream>
using namespace std;
int g[500],index[500];
int max_rect(int x[], int n)
{
int s = 0, maxsum = 0, i, j, h, area;
g[0] = index[0] = 0;
for (i = 0; i <= n; i++) {
h = i == n ? 0 : x[i];
for (j = i; g[s] > h; j = index[s--]) {
area = (i - index[s]) * g[s];
if (area > maxsum	) {
maxsum = area;
}
}
if (h > g[s]) {
g[++s] = h;
index[s] = j;
}
}
return maxsum;
}
int main()
{
int ia[]={2,1,4,5,1,3,3};
cout<<max_rect(ia,7)<<endl;
return 0;
}


这里说一下第二个算法的思路:

最近面积的右边界,其高度一定比右边的高度要高,否则不满足最大。找到每一列高度大于其右边高度的直方图,往左寻找每一个可能的

左边界,计算每一个可能的面积,更新最大。

有一个小技巧是在最后一个元素后面添加哨兵0,这样就可以处理右边界问题了。

#include <iostream>
#include <vector>
using namespace std;
vector<int> height;
int maxsum=0;
int largestRectangleArea(vector<int> &height)
{
int len=height.size();
height.push_back(0);
for(int i=0;i<len;i++)
{
if(height[i]<=height[i+1])continue;
int mmin=99999;
for(int j=i;j>=0;j--)
{
mmin=mmin<height[j]?mmin:height[j];
int area=mmin*(i-j+1);
if(area>maxsum)maxsum=area;
}
}
return maxsum;
}
int main()
{
int ia[]={7,2,1,4,5,1,3,3};
for(int i=0;i<8;i++)height.push_back(ia[i]);
cout<<largestRectangleArea(height)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: