Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
[解题思路]
1.brute force
枚举所有sub-matrix(O(N^2), N = m*n) ,检查每个子矩阵是不是都是1,如果是更新最大面积,检查子矩阵是否都是1需要
花费O(N). 故总的时间为O(N^3) N = m*n
可以过小数据,大数据直接TLE
1 public int maximalRectangle(char[][] matrix) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 int m = matrix.length; 5 if(m == 0){ 6 return m; 7 } 8 int n = matrix[0].length; 9 if(n == 0){ 10 return n; 11 } 12 13 return generateMaxArea(matrix); 14 } 15 16 private static int generateMaxArea(char[][] matrix) { 17 int m = matrix.length; 18 int n = matrix[0].length; 19 int maxArea = 0; 20 for (int i = 1; i <= m; i++) { 21 for (int j = 1; j <= n; j++) { 22 int subMatrixArea = enumerateSubMatrix(matrix, i, j); 23 if (subMatrixArea > maxArea) { 24 maxArea = subMatrixArea; 25 } 26 } 27 } 28 return maxArea; 29 } 30 31 public static int enumerateSubMatrix(char[][] matrix, int i, int j) { 32 int m = matrix.length; 33 int n = matrix[0].length; 34 int subMatrixArea = 0; 35 for (int p = 0; p <= (m - i); p++) { 36 for (int q = 0; q <= (n - j); q++) { 37 int area = getSubMatrixArea(matrix, p, q, p + i - 1, q + j - 1); 38 if (area > subMatrixArea) { 39 subMatrixArea = area; 40 } 41 } 42 } 43 return subMatrixArea; 44 } 45 46 private static int getSubMatrixArea(char[][] matrix, int p, int q, int i, 47 int j) { 48 for (int m = p; m <= i; m++) { 49 for (int n = q; n <= j; n++) { 50 if (matrix[m][n] == '0') { 51 return 0; 52 } 53 } 54 } 55 56 return (i - p + 1) * (j - q + 1); 57 }
2.DP
令dp[i][j]表示点(i,j)开始向右连续1的个数,花费O(M*N)的时间可以计算出来
接着从每个点开始,将该点作为矩形左上角点,从该点开始向下扫描直到最后一行或者dp[k][j] == 0
每次计算一个矩形的面积,与最大面积进行比较,如最大面积小于当前面积则进行更新,总的时间复杂度为O(M*N*M)
1 public int maximalRectangle(char[][] matrix) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 int m = matrix.length; 5 if(m == 0){ 6 return m; 7 } 8 int n = matrix[0].length; 9 int[][] dp = new int[m][n]; 10 11 for(int i = 0; i < m; i++){ 12 for(int j = 0; j < n; j++){ 13 if(matrix[i][j] == '0'){ 14 continue; 15 } else { 16 dp[i][j] = 1; 17 int k = j + 1; 18 while(k < n && (matrix[i][k] == '1')){ 19 dp[i][j] += 1; 20 k++; 21 } 22 } 23 } 24 } 25 int maxArea = 0; 26 for(int i = 0; i < m; i++){ 27 for(int j = 0; j < n; j++){ 28 if(dp[i][j] == 0){ 29 continue; 30 } else{ 31 int area = 0, minDpCol = dp[i][j]; 32 for(int k = i; k < m && dp[k][j] > 0; k++){ 33 if(dp[k][j] < minDpCol){ 34 minDpCol = dp[k][j]; 35 } 36 area = (k - i + 1) * minDpCol; 37 if(area > maxArea){ 38 maxArea = area; 39 } 40 } 41 } 42 } 43 } 44 return maxArea; 45 }