Problem Description:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example:
Input: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] Output: 6
Analysis:
本题的思路也是采用贪心算法,先从上到下记录每列最大的序列,然后在依次遍历每行的值,得出最大的值。
dp的数组取值如上所示,然后再遍历每一行的取值,遵循的算法也是从后往前,得出最后的最大的矩形值。代码如下:
Code:
class Solution {
public int maximalRectangle(char[][] matrix) {
int m = matrix.length;
if(m < 1)
return 0;
int n = matrix[0].length;
if(n < 1)
return 0;
int[][] dp = new int[m][n];
int maxValue = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(i == 0) {
dp[i][j] = matrix[i][j] == '1' ? 1 : 0;
} else {
dp[i][j] = matrix[i][j] == '1' ? dp[i -1 ][j] + 1 : 0;
}
int min = dp[i][j];
maxValue = Math.max(maxValue, dp[i][j]);
for(int k = j; k >= 0; k--) {
if(min == 0)
break;
if(dp[i][k] < min) {
min = dp[i][k];
}
maxValue = Math.max(maxValue, min * (j - k + 1));
}
}
}
return maxValue;
}
}