Find the largest rectangle of 1’s with swapping of columns allowed in Python


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

10010
10011
11010

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 −

00110
00111
10110

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 −

 Live Demo

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

Updated on: 20-Aug-2020

97 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements