题目描述
思路分析
单调栈
是84题的扩展,该题只需枚举矩形的下边界,求出以此边界往上数最多有多少个连续的1,即可将本题转化为第84题。
直接把第84题的代码复制过来调用。
代码实现
class Solution {
public:
int largestRectangleArea(vector<int>& h) {
int n=h.size();
vector<int> left(n),right(n);
stack<int> stk;
for(int i=0;i<h.size();i++){
while(stk.size()&&h[stk.top()]>=h[i]) stk.pop();
if(stk.empty()) left[i]=-1;
else left[i]=stk.top();
stk.push(i);
}
stk=stack<int>();
for(int i=n-1;i>=0;i--){
while(stk.size()&&h[stk.top()]>=h[i]) stk.pop();
if(stk.empty()) right[i]=n;
else right[i]=stk.top();
stk.push(i);
}
int ans=0;
for(int i=0;i<h.size();i++){
ans=max(ans,h[i]*(right[i]-left[i]-1));
}
return ans;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()||matrix[0].empty()) return 0;
int n=matrix.size(),m=matrix[0].size();
vector<vector<int>> f(n,vector<int>(m));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(matrix[i][j]=='1'){
if(i) f[i][j]=1+f[i-1][j];
else f[i][j]=1;
}
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(ans,largestRectangleArea(f[i]));
}
return ans;
}
};