public class Solution {
public int maximalRectangle(char[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int row = matrix.length;
int col = matrix[0].length;
int[] height = new int[col];
for (int j = 0; j < col; j++) {
if (matrix[0][j] == '1') {
height[j] = 1;
} else {
height[j] = 0;
}
}
int max = 0;
max = Math.max(myHistogram(height), max);
for (int i = 1; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == '0') {
height[j] = 0;
} else {
height[j]++;
}
}
max = Math.max(myHistogram(height), max);
}
return max;
}
private int myHistogram(int[] height) {
Stack<Integer> s = new Stack<Integer>();
int length = height.length;
int max = 0;
int i = 0;
while (i < length) {
if (s.isEmpty() || height[i] >= height[s.peek()]) {
s.push(i);
i++;
} else {
int loc = s.pop();
int high = height[loc];
int width = s.isEmpty() ? i : i - s.peek() - 1;
max = Math.max(width * high, max);
}
}
while (!s.isEmpty()) {
int loc = s.pop();
int high = height[loc];
int width = s.isEmpty() ? i : i - s.peek() -1 ;
max = Math.max(width * high, max);
}
return max;
}
}