您的位置:首页 > 其它

84.Largest Rectangle in Histogram

2016-04-20 11:02 197 查看
题目:Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.



int largestRectangleArea(vector<int>& heights) {
if(heights.empty())
return 0;
//给heights两边补零
vector<int> new_heights;
vector<int> area;
new_heights.push_back(-1);
for(int i=0;i<heights.size();i++)
new_heights.push_back(heights[i]);
new_heights.push_back(-1);
for(int i=0;i!=heights.size();i++)
{
vector<int> line_labels;
vector<int> line_width;
for(int j =1;j!=new_heights.size()-1;j++)
{
if(new_heights[j]>=heights[i] && new_heights[j-1]<heights[i])
{
line_labels.push_back(j);
}
if(new_heights[j]>=heights[i]  && new_heights[j+1]<heights[i])
{
line_labels.push_back(j);
}
}
vector<int> temp;
for(int i=0;i!=line_labels.size();i+=2)
{
temp.push_back(line_labels[i+1]-line_labels[i]+1);
}
int max_line=*max_element(temp.begin(),temp.end());
area.push_back(heights[i]*max_line);
}
int result=*max_element(area.begin(),area.end());
return result;
}


这是我的代码,测试了几个数据,结果是正确的。但是提交代码后,发现当测试数据的规模太大的时候,运行时间太长。下面简要说明我的代码的思路:使用遍历的思路,求出所有可能的面积,然后得到面积的最大值。求面积的思路是对于每一个给定的高度,确定相应的矩形左右边界。优点是容易理解,当然代价是计算复杂度高。

对于这个问题下面给出Discuss区的一个代码段:

int largestRectangleArea(vector<int> &height){
int ret=0;
height.push_back(0);
vector<int> index;

for(int i=0;i!=height.size();i++)
{
while(index.size() && height[index.back()]>=height[i])
{
int h=height[index.back()];
index.pop_back();

int sidx=index.size()>0 ? index.back() : -1;
if(h*(i-1-sidx)>ret)
ret=h*(i-1-sidx);
}
index.push_back(i);
}
return ret;
}


该代码的优点是不断更新最大面积值,而不是先求得所有可能的面积值,再得到最大面积值。该代码的核心是:保证
index.size()>0 && height[index.back()]>=height[i]


注意事项:

pop_back() 删除vector 数据的最后一个元素,并且数据的规模减1;

back() 返回vector 数据最后一个元素的引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: