题目要求:给定一个矩阵,元素只有0和1,求一个面积最大的矩形!
///思路一:看成是每一行向上可以延伸到多远,然后求以这个为底边的一个最大矩形,就是一个单调栈问题了!
/////思路二:预处理height[i][j]数组表示向上i,j可以到达多远,left[i][j]表示height[i][j]这条线段向左可以
////到达多远,right表示向右 答案就是max(height[i][j]*(right[i][j]-left[i][j]+1))
思路二的解法:
class Solution {
public:};
思路一的解法:
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
/* int n = matrix.size();
if(n==0)return 0;
int m = matrix[0].size();
if(m==0)return 0;
vector< vector<int> > height(n);
vector< vector<int> > left(n);
vector< vector<int> > right(n);
for(int i = 0;i<n;i++){
height[i].resize(m);
left[i].resize(m);
right[i].resize(m);
}
int ans = 0;
for(int i = 0;i<n;i++){
int lo =-1,ro = m;
for(int j = 0;j<m;j++){
if(matrix[i][j]=='0'){
height[i][j] = left[i][j] = 0;
lo = j;
}else {
height[i][j] = i==0?1:height[i-1][j]+1;
left[i][j] = i==0?lo+1:max(left[i-1][j],lo+1);
}
}
for(int j = m-1;j>=0;j--){
if(matrix[i][j]=='0'){
right[i][j] = m;
ro = j;
}else {
right[i][j] =i==0?ro-1:min(right[i-1][j],ro-1);
ans = max(ans,height[i][j]*(right[i][j]-left[i][j]+1));
}
}
}
return ans;*/
int n = matrix.size();
if(0==n)return 0;
int m = matrix[0].size();
if(0==m)return 0;
vector<vector<int> > height(2);
height[0].resize(m);
height[1].resize(m);
int loca = 0;
stack<int> s;
int ans = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(i==0){
height[loca][j] = matrix[0][j]-'0';
}else {
if(matrix[i][j]=='0')height[loca][j] = 0;
else height[loca][j] = height[1-loca][j]+1;
}
if(s.empty()){
s.push(j);
}else {
while(!s.empty() && height[loca][s.top()]>height[loca][j]){
int h = s.top();
s.pop();
if(!s.empty()){
ans = max(ans,height[loca][h]*(j-1-s.top()));
}else ans = max(ans,height[loca][h]*j);
}
s.push(j);
}
}
while(!s.empty()){
int h = s.top();
s.pop();
if(!s.empty()){
ans = max(ans,height[loca][h]*(m-1-s.top()));
}else ans = max(ans,height[loca][h]*m);
}
loca = 1-loca;
}
return ans;
}
};
思路一采用了滚动数组,加一个单调栈,和思路二的方法相比于少了很多空间!单调栈这里就不说了!