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;
        }
    };

    聪明又巧妙的解法。

  • 相关阅读:
    开源博客平台WordPress十岁啦!
    (转载)C# Attribute 用法备忘
    hibernate入门
    Hibernate对象关系映射基础
    struts2UI标签
    struts2文件上传2(多文件)
    struts2验证(手工)
    通过修改注册表改变txt文件的默认打开方式
    struts2验证(XML)
    Struts国际化
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3504202.html
Copyright © 2011-2022 走看看