zoukankan      html  css  js  c++  java
  • LeetCode OJ--Largest Rectangle in Histogram

    最近在学动态规划,初略一看以为动态规划来了,但是一分析发现不具备最优子结构,所以不是动态规划。

    那么对左边界和长度做个两层循环,遍历所有的可能,复杂度为O(n2),代码如下:

    class Solution {
    public:
        int largestRectangleArea(vector<int> &height) {
            int smallest;
            int ans = 0;
            int size;
            for(int i = 0;i<height.size();i++)//左边起始位置
            {
                size = 1* height[i];
                smallest = height[i];
                for(int j = 1;i+j<= height.size();j++)//长度
                {
                    if(smallest>height[i+j-1]) 
                    {
                        smallest = height[i+j-1];
                    }
                    size = smallest*j;
                    if(size>ans)
                        ans = size;
                }
            }
            return ans;
        }
    };
     

    提交后,超时。于是在网上搜结题方法,找到一个O(n)的很聪明巧妙的办法,参考http://blog.csdn.net/abcbc/article/details/8943485。可以模拟这个过程,代码如下:

    class Solution {
    public:
        int largestRectangleArea(vector<int> &height) {
             int area = 0;
             stack<int> xiaBiao; //存储元素的下标
             for(int i = 0;i< height.size();i++)
             {
                 if(xiaBiao.empty() || height[i]>height[xiaBiao.top()]) //如果是增的,入栈
                     xiaBiao.push(i);
                 else{
                     int taller = xiaBiao.top(); //取栈顶
                     xiaBiao.pop();
                     int width = xiaBiao.empty()?i:i - xiaBiao.top() -1; //考虑要全面,找到左边矮的矩阵,得到中间宽度。
                     if(area <width*height[taller])
                         area = width*height[taller];
                     i--;
                 }
             }
             while(!xiaBiao.empty())  //当栈中还有内容时
             {
                 int taller = xiaBiao.top();
                 xiaBiao.pop();
                 int width = xiaBiao.empty() ? height.size() : height.size() - xiaBiao.top() - 1;  
                 area = max(area, height[taller] * width);  
             }
             return area;
        }
    };

    聪明又巧妙的解法。

  • 相关阅读:
    Eclipse RCP与Spring OSGi:技术详解与最佳实践
    AutoCAD 2016机械设计从入门到精通(第2版)
    中文版CorelDRAW X7平面设计
    神奇的中文版Photoshop CC 2017入门书
    Hadoop实战(第2版)
    1048.判断三角形类型
    1046.求最大值
    1047.素数判定
    1056.最大公约数
    1057.众数
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3504202.html
Copyright © 2011-2022 走看看