84.Largest Rectangle in Histogram

题目: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]
注意事项:

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

  2. back() 返回vector 数据最后一个元素的引用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值