最近在学动态规划,初略一看以为动态规划来了,但是一分析发现不具备最优子结构,所以不是动态规划。
那么对左边界和长度做个两层循环,遍历所有的可能,复杂度为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; } };
聪明又巧妙的解法。