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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size = matrix.size();
if (size == 0) {
return 0;
}
int max_area = 0;
int area = 0;
int max_width = 0;
int max_height = 0;
for (int i = 0; i < size; ++i) {
max_height = size - i;
if (max_height * matrix[i].size() <= max_area) {
break;
}
for (int j = 0 ; j < matrix[i].size(); ++j) {
max_width = matrix[i].size() - j;
if (max_width * max_height <= max_area) {
break;
}
if (matrix[i][j] == '1') {
area = findMaxArea(i, j, matrix);
max_area = max_area > area ? max_area : area;
}
}
}
return max_area;
}
private:
int findMaxArea(int a, int b, vector<vector<char> > &m) {
int size = m.size();
int max_width_bound = m[a].size();
int area = 0;
int max_area = 0;
for (int i = a; i < size; ++i) {
for (int j = b; j < max_width_bound; ++j) {
if (m[i][j] == '0') {
max_width_bound = j;
break;
}
}
area = (i - a + 1) * (max_width_bound - b);
max_area = max_area > area ? max_area : area;
}
return max_area;
}
};