Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size();
if(m == 0){
return 0;
}
int n = matrix[0].size();
if(n == 0){
return 0;
}
vector<int> count(n, 0);
vector<bool> isProcessed(n, false);
int area = 0;
for(size_t i = 0; i < m; ++i){
for(size_t j = 0; j < n; ++j){
if(matrix[i][j] == '0'){
count[j] = 0;
isProcessed[j] = true;
}else{
count[j]++;
isProcessed[j] = false;
}
}
for(size_t j = 0; j < n; ++j){
if(isProcessed[j]){
continue;
}
int biasLeft = 1;
int biasRight = 1;
while( (j-biasLeft >= 0) && (count[j-biasLeft] >= count[j]) ){
if(count[j-biasLeft] == count[j]){
isProcessed[j-biasLeft] = true;
}
biasLeft++;
}
while( (j+biasRight < n) && (count[j+biasRight] >= count[j]) ){
biasRight++;
}
area = max(area, (biasRight + biasLeft - 1)*count[j]);
}
}
return area;
}
};