Suppose we have a binary matrix, we have to find the largest rectangle of all 1's in that given matrix. The rectangle can be built by swapping or exchanging any pair of columns of that matrix.
So, if the input is like
1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
then the output will be the 6 in this case. The rectangle can be generating by exchanging column 1 with 3. The matrix after exchanging will be −
0 | 0 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 0 |
To solve this, we will follow these steps −
row := size of mat
col := size of mat[0]
temp := a matrix of order (row + 1) x (col + 1), and fill with 0
for i in range 0 to col, do
temp[0, i] := mat[0, i]
for j in range 1 to row, do
if mat[j, i] is same as 0, then
temp[j, i] := 0
otherwise,
temp[j, i] := temp[j - 1, i] + 1
for i in range 0 to row, do
cnt := an array of size (row + 1), and filled with 0
for j in range 0 to col, increase by 1, do
cnt[temp[i, j]] := cnt[temp[i, j]] + 1
col_no := 0
j := row
while j >= 0, do
if cnt[j] > 0, then
for k in range 0 to cnt[j], do
temp[i, col_no] := j
col_no := col_no + 1
j := j - 1
area_maximum := 0
for i in range 0 to row, do
for j in range 0 to col, do
area_current :=(j + 1) * temp[i, j]
if area_current > area_maximum, then
area_maximum := area_current
return area_maximum
Example
Let us see the following implementation to get better understanding −
def maxArea(mat): row = len(mat) col = len(mat[0]) temp = [[0 for i in range(col + 1)] for i in range(row + 1)] for i in range(0, col): temp[0][i] = mat[0][i] for j in range(1, row): if ((mat[j][i] == 0)): temp[j][i] = 0 else: temp[j][i] = temp[j - 1][i] + 1 for i in range(0, row): cnt = [0 for i in range(row + 1)] for j in range(0, col, 1): cnt[temp[i][j]] += 1 col_no = 0 j = row while(j >= 0): if (cnt[j] > 0): for k in range(0, cnt[j]): temp[i][col_no] = j col_no += 1 j -= 1 area_maximum = 0 for i in range(0, row): for j in range(0, col): area_current = (j + 1) * temp[i][j] if (area_current > area_maximum): area_maximum = area_current return area_maximum mat = [ [0, 0, 1, 1, 0], [0, 0, 1, 1, 1], [1, 0, 1, 1, 0]] print("Area : ",maxArea(mat))
Input
[ [1, 0, 0, 1, 0], [1, 0, 0, 1, 1], [1, 1, 0, 1, 0]]
Output
Area : 2