Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
Solution:
Code:
<span style="font-size:14px;">class Solution {
public:
void convert(vector<vector<char> > &matrix, vector<vector<int> > &heights, const int &rows, const int &cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
for (int k = i; k >= 0; k--) {
if (matrix[k][j] == '0')
break;
else
heights[i][j]++;
}
}
}
}
int helper(vector<vector<int> > &heights, const int &row, const int &cols) {
int result = 0;
stack<int> stk;
for (int col = 0; col < cols;) {
if (stk.empty() || heights[row][stk.top()] <= heights[row][col])
stk.push(col++);
else {
int position = stk.top();
stk.pop();
result = max(result, heights[row][position]*(stk.empty()?col:(col-stk.top()-1)));
}
}
while (!stk.empty()) {
int position = stk.top();
stk.pop();
result = max(result, heights[row][position]*(stk.empty()?cols:(cols-stk.top()-1)));
}
return result;
}
int maximalRectangle(vector<vector<char> > &matrix) {
int rows = matrix.size();
if (rows == 0) return 0;
int cols = matrix[0].size();
vector<vector<int> > heights(rows, vector<int>(cols, 0));
convert(matrix, heights, rows, cols);
int result = 0;
for (int row = 0; row < rows; row++)
result = max(result, helper(heights, row, cols));
return result;
}
};</span>