题目:
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.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
之前做过类似的题,有O(n)复杂度的做法,用栈维护一个递增的序列,栈中存对应高度的位置。
每遍历一个元素,判断是否是栈中最大的元素,如果不是,把栈顶的元素弹出,并计算以栈顶元素为最大值高度时的长方形面积。
面积的长度为栈顶元素之前的一个元素到当前遍历的元素的之间的长度,边界情况特殊考虑。
- class Solution {
- public:
- int largestRectangleArea(vector<int> &height) {
- stack<int>s;
- int len=height.size(),maxx=0;
- for(int i=0;i<len;++i)
- {
- if(s.empty())s.push(i);
- else
- {
- while(!s.empty()&&height[s.top()]>height[i])
- {
- int ph=s.top();
- s.pop();
- if(!s.empty())
- maxx=max(maxx,(i-s.top()-1)*height[ph]);
- else
- maxx=max(maxx,i*height[ph]);
- }
- s.push(i);
- }
- }
- while(!s.empty())
- {
- int ph=s.top();
- s.pop();
- if(!s.empty())
- maxx=max(maxx,(len-s.top()-1)*height[ph]);
- else
- maxx=max(maxx,len*height[ph]);
- }
- return maxx;
- }
- };
题目:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
题意有一个01组成的矩阵,找到其中面积最大的,全部由1构成的子矩阵。
去年做多校比赛的时候第一次见到这题,不优化到O(n×n)死活过不了当时。
优化就是先预处理成保存成,当前点向上都是1的最高的高度,就变成每一行都是一个直方图,
之后用O(n)的直方图求最大面积去算,之前一篇文章 http://blog.csdn.net/havenoidea/article/details/11854723介绍过这个步骤,就不细说。
- int height[1000][1000];
- class Solution {
- public:
- int maximalRectangle(vector<vector<char> > &matrix) {
- int i,j,k,row,col,maxx=0;
- row=matrix.size();
- if(row==0)return 0;
- col=matrix[0].size();
- if(col==0)return 0;
- for(j=0;j<col;++j)
- for(i=0;i<row;++i)
- if(matrix[i][j]=='0')height[i][j]=0; 不是连续的1 就要清零
- else if(i==0)height[0][j]=1;
- else height[i][j]=height[i-1][j]+1;
- stack<int>s;
- for(i=0;i<row;++i)
- {
- for(j=0;j<col;++j)
- {
- if(s.empty())s.push(j);
- else
- {
- while(!s.empty()&&height[i][s.top()]>height[i][j])
- {
- int ph=s.top();
- s.pop();
- if(!s.empty())
- maxx=max(maxx,(j-s.top()-1)*height[i][ph]);
- else
- maxx=max(maxx,j*height[i][ph]);
- }
- s.push(j);
- }
- }
- while(!s.empty())
- {
- int ph=s.top();
- s.pop();
- if(!s.empty())
- maxx=max(maxx,(col-s.top()-1)*height[i][ph]);
- else
- maxx=max(maxx,col*height[i][ph]);
- }
- }
- return maxx;
- }
- };