Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0Return 6.
这个题目对我来说蛮难的,最后参考了别人的算法。
Runtime: 7 ms runtime beats 99.36% of java submissions.
public int maximalRectangle(char[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return 0;
int row = matrix.length, col = matrix[0].length;
int max = 0;
int[][] record = new int[col][3];
for (int i = 0; i < col; i++) {
record[i][0] = 0;//Rectangle的长度的左边col
record[i][1] = col;//Rectangle的长度的右边col
record[i][2] = 0;//Rectangle的高度
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == '1') {
int left = j, k = j + 1, right;
for (; k < col && matrix[i][k] == '1'; k++) ;
right = k;
for (k = left; k < right; k++) {
record[k][0] = Math.max(record[k][0], left);
record[k][1] = Math.min(record[k][1], right);
record[k][2] = record[k][2] + 1;
int square = (record[k][1] - record[k][0]) * record[k][2];
if (square > max)
max = square;
}
j = right - 1;//因为left到right-1之间的1都已经遍历过了,所以直接跳到right-1
} else {
record[j][0] = 0;
record[j][1] = col;
record[j][2] = 0;
}
}
}
return max;
}