首页 > 代码库 > Leetcode-Maximal Rectangle

Leetcode-Maximal Rectangle

Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.

Analysis:

For each position (i,j), we calculate how many accumlative 1s at the left direction of this position at this row. We record this number at d[i][j]. For example, for matrix:

0 0 0 1 1 1

0 1 1 1 1 1

0 1 1 1 1 1

1 0 1 1 1 1

We have matrix d[i][j]

0 0 0 1 2 3

0 1 2 3 4 5

0 1 2 3 4 5

1 0 1 2 3 4

Then, at each postion (i,j), we scan the matrix along the upper direction and calculate the area of the maximum 1 matrix with the right bottom corner at (i,j). For row k<i, the 1s matrix should be (k-i+1)*min(d[l][j], l=k...i);

After caluclating the 1s matrix for each (i,j), we get the answer.

Solution:

 1 public class Solution { 2     public int maximalRectangle(char[][] matrix) { 3         int rowNum = matrix.length; 4         if (rowNum==0) return 0; 5         int colNum = matrix[0].length; 6         if (colNum==0) return 0; 7  8         int[][] d = new int[rowNum][colNum]; 9         for (int i=0;i<rowNum;i++)10             for (int j=0;j<colNum;j++)11                 if (j==0)12                     if (matrix[i][j]==‘1‘) d[i][j]=1;13                     else d[i][j]=0;14                 else15                     if (matrix[i][j]==‘1‘) d[i][j]=d[i][j-1]+1;16                     else d[i][j]=0;17 18         int maxSoFar = -1;19         for (int i=0;i<rowNum;i++)20             for (int j=0;j<colNum;j++){21                 int curMax = d[i][j];22                 int minLen = d[i][j];23                 for (int k=(i-1);k>=0;k--){24                     if (d[k][j]==0) break;25                     if (d[k][j]<minLen) minLen = d[k][j];26                     int newMax = (i-k+1)*minLen;27                     if (curMax<newMax) curMax = newMax;28                 }29                 if (curMax>maxSoFar) maxSoFar = curMax;30 31             }32 33         return maxSoFar;34     }35 }

 

Leetcode-Maximal Rectangle