Given a 2D array of 1 and 0, Find the largest rectangle of 1’s or 0’s ie. rectangle (may not be square) which is made up of all 1’s or 0’s.
For example, A = 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 Then the largest rectangle is the 2X2 rectangle with top-left corner at (1, 2).
How do we solve it?
We can transform this problem into a set of Maximum Area Rectangle in a histogram sub-problems, one for each row. We will convert each of the row into a histogram such that the height of the bars is equal to the consecutive no of 1’s above it. For example,
A = 0 1 1 0 1 | _ 1 0 2 1 0 |_ | |_ 2 0 3 2 1 | | | | |_ |_|_|_|_|_|___ 2 0 3 2 1
Now, apply Maximum histogram rectangle area problem for each of the n rows and then find the maximum of all the n row-histogram max-rectangle area. I have discussed in a separate post about how to solve the Maximum Area Rectangle in a histogram problem. Following is the code for this problem using the solution of maximum area rectangle in a histogram. Overall complexity is minimal O(n^2).
public int maxRectangleOf1s(final int A[][]) { int maxArea = 0; final int n = A.length; final int m = A[0].length; final int histograms[][] = new int[n][m]; // convert each of the row into a histogram such that the height of the bars is equal to the consecutive no of // 1's above. // first intialize the top row with the input array for (int j = 0; j < m; j++) { histograms[0][j] = A[0][j] == 1 ? 1 : 0; } // now compute the histograms. for (int i = 1; i < n; i++) { for (int j = 0; j < m; j++) { histograms[i][j] = A[i][j] == 1 ? histograms[i - 1][j] + A[i][j] : 0; } } // now we have total n histograms, one for each row. Calculate the max area rectangle for each of this // histogram. for (int i = 0; i < n; i++) { maxArea = Math.max(maxArea, maxAreaRectangleHistogram(histograms[i])); } return maxArea; }