Given a binary matrix, find out the maximum size square sub-matrix with all 1s.
For example, consider the below binary matrix.

Algorithm:
Let the given binary matrix be M[R][C]. The idea of the algorithm is to construct an auxiliary size matrix S[][] in which each entry S[i][j] represents the size of the square sub-matrix with all 1s including M[i][j] where M[i][j] is the rightmost and bottom-most entry in sub-matrix.
1) Construct a sum matrix S[R][C] for the given M[R][C].
a) Copy first row and first columns as it is from M[][] to S[][]
b) For other entries, use following expressions to construct S[][]
If M[i][j] is 1 then
S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
Else /*If M[i][j] is 0*/
S[i][j] = 0
2) Find the maximum entry in S[R][C]
3) Using the value and coordinates of maximum entry in S[i], print
sub-matrix of M[][]
For the given M[R][C] in the above example, constructed S[R][C] would be:
0 1 1 0 1
1 1 0 1 0
0 1 1 1 0
1 1 2 2 0
1 2 2 3 1
0 0 0 0 0
The value of the maximum entry in the above matrix is 3 and the coordinates of the entry are (4, 3). Using the maximum value and its coordinates, we can find out the required sub-matrix.
C++
#include <bits/stdc++.h>
#define bool int
#define R 6
#define C 5
using namespace std;
void printMaxSubSquare( bool M[R][C])
{
int i, j;
int S[R][C];
int max_of_s, max_i, max_j;
for (i = 0; i < R; i++)
S[i][0] = M[i][0];
for (j = 0; j < C; j++)
S[0][j] = M[0][j];
for (i = 1; i < R; i++) {
for (j = 1; j < C; j++) {
if (M[i][j] == 1)
S[i][j]
= min({ S[i][j - 1], S[i - 1][j],
S[i - 1][j - 1] })
+ 1;
else
S[i][j] = 0;
}
}
max_of_s = S[0][0];
max_i = 0;
max_j = 0;
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
if (max_of_s < S[i][j]) {
max_of_s = S[i][j];
max_i = i;
max_j = j;
}
}
}
cout << "Maximum size sub-matrix is: \n" ;
for (i = max_i; i > max_i - max_of_s; i--) {
for (j = max_j; j > max_j - max_of_s; j--) {
cout << M[i][j] << " " ;
}
cout << "\n" ;
}
}
int main()
{
bool M[R][C] = { { 0, 1, 1, 0, 1 }, { 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 } };
printMaxSubSquare(M);
}
|
C
#include <stdio.h>
#define bool int
#define R 6
#define C 5
void printMaxSubSquare( bool M[R][C])
{
int i, j;
int S[R][C];
int max_of_s, max_i, max_j;
for (i = 0; i < R; i++)
S[i][0] = M[i][0];
for (j = 0; j < C; j++)
S[0][j] = M[0][j];
for (i = 1; i < R; i++) {
for (j = 1; j < C; j++) {
if (M[i][j] == 1)
S[i][j] = min(S[i][j - 1], S[i - 1][j],
S[i - 1][j - 1])
+ 1;
else
S[i][j] = 0;
}
}
max_of_s = S[0][0];
max_i = 0;
max_j = 0;
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
if (max_of_s < S[i][j]) {
max_of_s = S[i][j];
max_i = i;
max_j = j;
}
}
}
printf ( "Maximum size sub-matrix is: \n" );
for (i = max_i; i > max_i - max_of_s; i--) {
for (j = max_j; j > max_j - max_of_s; j--) {
printf ( "%d " , M[i][j]);
}
printf ( "\n" );
}
}
int min( int a, int b, int c)
{
int m = a;
if (m > b)
m = b;
if (m > c)
m = c;
return m;
}
int main()
{
bool M[R][C] = { { 0, 1, 1, 0, 1 }, { 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 } };
printMaxSubSquare(M);
getchar ();
}
|
Java
public class GFG {
static void printMaxSubSquare( int M[][])
{
int i, j;
int R = M.length;
int C = M[ 0 ].length;
int S[][] = new int [R][C];
int max_of_s, max_i, max_j;
for (i = 0 ; i < R; i++)
S[i][ 0 ] = M[i][ 0 ];
for (j = 0 ; j < C; j++)
S[ 0 ][j] = M[ 0 ][j];
for (i = 1 ; i < R; i++) {
for (j = 1 ; j < C; j++) {
if (M[i][j] == 1 )
S[i][j] = Math.min(
S[i][j - 1 ],
Math.min(S[i - 1 ][j],
S[i - 1 ][j - 1 ]))
+ 1 ;
else
S[i][j] = 0 ;
}
}
max_of_s = S[ 0 ][ 0 ];
max_i = 0 ;
max_j = 0 ;
for (i = 0 ; i < R; i++) {
for (j = 0 ; j < C; j++) {
if (max_of_s < S[i][j]) {
max_of_s = S[i][j];
max_i = i;
max_j = j;
}
}
}
System.out.println( "Maximum size sub-matrix is: " );
for (i = max_i; i > max_i - max_of_s; i--) {
for (j = max_j; j > max_j - max_of_s; j--) {
System.out.print(M[i][j] + " " );
}
System.out.println();
}
}
public static void main(String[] args)
{
int M[][]
= { { 0 , 1 , 1 , 0 , 1 }, { 1 , 1 , 0 , 1 , 0 },
{ 0 , 1 , 1 , 1 , 0 }, { 1 , 1 , 1 , 1 , 0 },
{ 1 , 1 , 1 , 1 , 1 }, { 0 , 0 , 0 , 0 , 0 } };
printMaxSubSquare(M);
}
}
|
Python3
def printMaxSubSquare(M):
R = len (M)
C = len (M[ 0 ])
S = []
for i in range (R):
temp = []
for j in range (C):
if i = = 0 or j = = 0 :
temp + = M[i][j],
else :
temp + = 0 ,
S + = temp,
for i in range ( 1 , R):
for j in range ( 1 , C):
if (M[i][j] = = 1 ):
S[i][j] = min (S[i][j - 1 ], S[i - 1 ][j],
S[i - 1 ][j - 1 ]) + 1
else :
S[i][j] = 0
max_of_s = S[ 0 ][ 0 ]
max_i = 0
max_j = 0
for i in range (R):
for j in range (C):
if (max_of_s < S[i][j]):
max_of_s = S[i][j]
max_i = i
max_j = j
print ( "Maximum size sub-matrix is: " )
for i in range (max_i, max_i - max_of_s, - 1 ):
for j in range (max_j, max_j - max_of_s, - 1 ):
print (M[i][j], end = " " )
print ("")
M = [[ 0 , 1 , 1 , 0 , 1 ],
[ 1 , 1 , 0 , 1 , 0 ],
[ 0 , 1 , 1 , 1 , 0 ],
[ 1 , 1 , 1 , 1 , 0 ],
[ 1 , 1 , 1 , 1 , 1 ],
[ 0 , 0 , 0 , 0 , 0 ]]
printMaxSubSquare(M)
|
C#
using System;
public class GFG {
static void printMaxSubSquare( int [, ] M)
{
int i, j;
int R = M.GetLength(0);
int C = M.GetLength(1);
int [, ] S = new int [R, C];
int max_of_s, max_i, max_j;
for (i = 0; i < R; i++)
S[i, 0] = M[i, 0];
for (j = 0; j < C; j++)
S[0, j] = M[0, j];
for (i = 1; i < R; i++) {
for (j = 1; j < C; j++) {
if (M[i, j] == 1)
S[i, j] = Math.Min(
S[i, j - 1],
Math.Min(S[i - 1, j],
S[i - 1, j - 1]))
+ 1;
else
S[i, j] = 0;
}
}
max_of_s = S[0, 0];
max_i = 0;
max_j = 0;
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
if (max_of_s < S[i, j]) {
max_of_s = S[i, j];
max_i = i;
max_j = j;
}
}
}
Console.WriteLine( "Maximum size sub-matrix is: " );
for (i = max_i; i > max_i - max_of_s; i--) {
for (j = max_j; j > max_j - max_of_s; j--) {
Console.Write(M[i, j] + " " );
}
Console.WriteLine();
}
}
public static void Main()
{
int [, ] M = new int [6, 5] {
{ 0, 1, 1, 0, 1 }, { 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }
};
printMaxSubSquare(M);
}
}
|
PHP
<?php
function printMaxSubSquare( $M , $R , $C )
{
$S = array ( array ()) ;
for ( $i = 0; $i < $R ; $i ++)
$S [ $i ][0] = $M [ $i ][0];
for ( $j = 0; $j < $C ; $j ++)
$S [0][ $j ] = $M [0][ $j ];
for ( $i = 1; $i < $R ; $i ++)
{
for ( $j = 1; $j < $C ; $j ++)
{
if ( $M [ $i ][ $j ] == 1)
$S [ $i ][ $j ] = min( $S [ $i ][ $j - 1],
$S [ $i - 1][ $j ],
$S [ $i - 1][ $j - 1]) + 1;
else
$S [ $i ][ $j ] = 0;
}
}
$max_of_s = $S [0][0];
$max_i = 0;
$max_j = 0;
for ( $i = 0; $i < $R ; $i ++)
{
for ( $j = 0; $j < $C ; $j ++)
{
if ( $max_of_s < $S [ $i ][ $j ])
{
$max_of_s = $S [ $i ][ $j ];
$max_i = $i ;
$max_j = $j ;
}
}
}
printf( "Maximum size sub-matrix is: \n" );
for ( $i = $max_i ;
$i > $max_i - $max_of_s ; $i --)
{
for ( $j = $max_j ;
$j > $max_j - $max_of_s ; $j --)
{
echo $M [ $i ][ $j ], " " ;
}
echo "\n" ;
}
}
# Driver code
$M = array ( array (0, 1, 1, 0, 1),
array (1, 1, 0, 1, 0),
array (0, 1, 1, 1, 0),
array (1, 1, 1, 1, 0),
array (1, 1, 1, 1, 1),
array (0, 0, 0, 0, 0));
$R = 6 ;
$C = 5 ;
printMaxSubSquare( $M , $R , $C );
?>
|
Javascript
<script>
let R = 6;
let C = 5;
function printMaxSubSquare(M) {
let i,j;
let S = [];
for ( var y = 0; y < R; y++ ) {
S[ y ] = [];
for ( var x = 0; x < C; x++ ) {
S[ y ][ x ] = 0;
}
}
let max_of_s, max_i, max_j;
for (i = 0; i < R; i++)
S[i][0] = M[i][0];
for (j = 0; j < C; j++)
S[0][j] = M[0][j];
for (i = 1; i < R; i++)
{
for (j = 1; j < C; j++)
{
if (M[i][j] == 1)
S[i][j] = Math.min(S[i][j-1],Math.min( S[i-1][j],
S[i-1][j-1])) + 1;
else
S[i][j] = 0;
}
}
max_of_s = S[0][0]; max_i = 0; max_j = 0;
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
if (max_of_s < S[i][j])
{
max_of_s = S[i][j];
max_i = i;
max_j = j;
}
}
}
document.write( "Maximum size sub-matrix is: <br>" );
for (i = max_i; i > max_i - max_of_s; i--)
{
for (j = max_j; j > max_j - max_of_s; j--)
{
document.write( M[i][j] , " " );
}
document.write( "<br>" );
}
}
let M = [[0, 1, 1, 0, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0]];
printMaxSubSquare(M);
</script>
|
Output
Maximum size sub-matrix is:
1 1 1
1 1 1
1 1 1
Time Complexity: O(m*n) where m is the number of rows and n is the number of columns in the given matrix.
Auxiliary Space: O(m*n) where m is the number of rows and n is the number of columns in the given matrix.
Algorithmic Paradigm: Dynamic Programming
Space Optimized Solution: In order to compute an entry at any position in the matrix we only need the current row and the previous row.
C++
#include <bits/stdc++.h>
using namespace std;
#define R 6
#define C 5
void printMaxSubSquare( bool M[R][C])
{
int S[2][C], Max = 0;
memset (S, 0, sizeof (S));
for ( int i = 0; i < R; i++)
for ( int j = 0; j < C; j++) {
int Entrie = M[i][j];
if (Entrie)
if (j)
Entrie
= 1
+ min(S[1][j - 1],
min(S[0][j - 1], S[1][j]));
S[0][j] = S[1][j];
S[1][j] = Entrie;
Max = max(Max, Entrie);
}
cout << "Maximum size sub-matrix is: \n" ;
for ( int i = 0; i < Max; i++, cout << '\n' )
for ( int j = 0; j < Max; j++)
cout << "1 " ;
}
int main()
{
bool M[R][C] = { { 0, 1, 1, 0, 1 }, { 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 } };
printMaxSubSquare(M);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int R = 6 ;
static int C = 5 ;
static void printMaxSubSquare( int M[][])
{
int S[][] = new int [ 2 ][C], Max = 0 ;
for ( int i = 0 ; i < 2 ; i++) {
for ( int j = 0 ; j < C; j++) {
S[i][j] = 0 ;
}
}
for ( int i = 0 ; i < R; i++) {
for ( int j = 0 ; j < C; j++) {
int Entrie = M[i][j];
if (Entrie != 0 ) {
if (j != 0 ) {
Entrie = 1
+ Math.min(
S[ 1 ][j - 1 ],
Math.min(S[ 0 ][j - 1 ],
S[ 1 ][j]));
}
}
S[ 0 ][j] = S[ 1 ][j];
S[ 1 ][j] = Entrie;
Max = Math.max(Max, Entrie);
}
}
System.out.print( "Maximum size sub-matrix is: \n" );
for ( int i = 0 ; i < Max; i++) {
for ( int j = 0 ; j < Max; j++) {
System.out.print( "1 " );
}
System.out.println();
}
}
public static void main(String[] args)
{
int M[][]
= { { 0 , 1 , 1 , 0 , 1 }, { 1 , 1 , 0 , 1 , 0 },
{ 0 , 1 , 1 , 1 , 0 }, { 1 , 1 , 1 , 1 , 0 },
{ 1 , 1 , 1 , 1 , 1 }, { 0 , 0 , 0 , 0 , 0 } };
printMaxSubSquare(M);
}
}
|
Python3
R = 6
C = 5
def printMaxSubSquare(M):
global R, C
Max = 0
S = [[ 0 for col in range (C)] for row in range ( 2 )]
for i in range (R):
for j in range (C):
Entrie = M[i][j]
if (Entrie):
if (j):
Entrie = 1 + min (S[ 1 ][j - 1 ], min (S[ 0 ][j - 1 ], S[ 1 ][j]))
S[ 0 ][j] = S[ 1 ][j]
S[ 1 ][j] = Entrie
Max = max ( Max , Entrie)
print ( "Maximum size sub-matrix is: " )
for i in range ( Max ):
for j in range ( Max ):
print ( "1" , end = " " )
print ()
M = [[ 0 , 1 , 1 , 0 , 1 ],
[ 1 , 1 , 0 , 1 , 0 ],
[ 0 , 1 , 1 , 1 , 0 ],
[ 1 , 1 , 1 , 1 , 0 ],
[ 1 , 1 , 1 , 1 , 1 ],
[ 0 , 0 , 0 , 0 , 0 ]]
printMaxSubSquare(M)
|
C#
using System;
using System.Numerics;
using System.Collections.Generic;
public class GFG {
static int R = 6;
static int C = 5;
static void printMaxSubSquare( int [, ] M)
{
int [, ] S = new int [2, C];
int Maxx = 0;
for ( int i = 0; i < 2; i++) {
for ( int j = 0; j < C; j++) {
S[i, j] = 0;
}
}
for ( int i = 0; i < R; i++) {
for ( int j = 0; j < C; j++) {
int Entrie = M[i, j];
if (Entrie != 0) {
if (j != 0) {
Entrie = 1
+ Math.Min(
S[1, j - 1],
Math.Min(S[0, j - 1],
S[1, j]));
}
}
S[0, j] = S[1, j];
S[1, j] = Entrie;
Maxx = Math.Max(Maxx, Entrie);
}
}
Console.Write( "Maximum size sub-matrix is: \n" );
for ( int i = 0; i < Maxx; i++) {
for ( int j = 0; j < Maxx; j++) {
Console.Write( "1 " );
}
Console.WriteLine();
}
}
public static void Main( string [] args)
{
int [, ] M
= { { 0, 1, 1, 0, 1 }, { 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 } };
printMaxSubSquare(M);
}
}
|
Javascript
<script>
const R = 6
const C = 5
function printMaxSubSquare(M)
{
let Max = 0
let S = new Array(2)
for (let i=0;i<2;i++){
S[i] = new Array(C).fill(0)
}
for (let i = 0; i < R;i++)
for (let j = 0; j < C;j++){
let Entrie = M[i][j];
if (Entrie)
if (j)
Entrie = 1 + Math.min(S[1][j - 1],
Math.min(S[0][j - 1], S[1][j]));
S[0][j] = S[1][j];
S[1][j] = Entrie;
Max = Math.max(Max, Entrie);
}
document.write( "Maximum size sub-matrix is: " , "</br>" )
for (let i = 0; i < Max; i++){
for (let j = 0; j < Max;j++)
document.write( "1 " )
document.write( "</br>" )
}
}
const M = [[0, 1, 1, 0, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0]]
printMaxSubSquare(M)
</script>
|
Output
Maximum size sub-matrix is:
1 1 1
1 1 1
1 1 1
Time Complexity: O(m*n) where m is the number of rows and n is the number of columns in the given matrix.
Auxiliary space: O(n) where n is the number of columns in the given matrix.
Please write comments if you find any bug in the above code/algorithm, or find other ways to solve the same problem
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
30 Nov, 2022
Like Article
Save Article