qingcheng奕  

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

那么对左边界和长度做个两层循环,遍历所有的可能,复杂度为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;
    }
};

聪明又巧妙的解法。

posted on 2014-01-03 19:32  qingcheng奕  阅读(159)  评论(0编辑  收藏  举报