Related Articles
Maximum size of square such that all submatrices of that size have sum less than K
• Difficulty Level : Hard
• Last Updated : 30 Dec, 2020

Given an N x M matrix of integers and an integer K, the task is to find the size of the maximum square sub-matrix (S x S), such that all square sub-matrices of the given matrix of that size have a sum less than K.

Examples:

Input: K = 30
mat[N][M] = {{1, 2, 3, 4, 6},
{5, 3, 8, 1, 2},
{4, 6, 7, 5, 5},
{2, 4, 8, 9, 4} };
Output: 2
Explanation:
All Sub-matrices of size 2 x 2
have sum less than 30

Input : K = 100
mat[N][M] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
Output: 3
Explanation:
All Sub-matrices of size 3 x 3
have sum less than 100

Naive Approach The basic solution is to choose the size S of the submatrix and find all the submatrices of that size and check that the sum of all sub-matrices is less than the given sum whereas, this can be improved by computing the sum of the matrix using this approach. Therefore, the task will be to choose the maximum size possible and the starting and ending position of the every possible sub-matrices. Due to which the overall time complexity will be O(N3).

Below is the implementation of the above approach:

## C++

 // C++ implementation to find the// maximum size square submatrix// such that their sum is less than K #include  using namespace std; // Size of matrix#define N 4#define M 5 // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizevoid preProcess(int mat[N][M],                int aux[N][M]){    // Loop to copy the first row    // of the matrix into the aux matrix    for (int i = 0; i < M; i++)        aux[0][i] = mat[0][i];         // Computing the sum column-wise    for (int i = 1; i < N; i++)        for (int j = 0; j < M; j++)            aux[i][j] = mat[i][j] +                      aux[i - 1][j];     // Computing row wise sum    for (int i = 0; i < N; i++)        for (int j = 1; j < M; j++)            aux[i][j] += aux[i][j - 1];} // Function to find the sum of a// submatrix with the given indicesint sumQuery(int aux[N][M], int tli,          int tlj, int rbi, int rbj){    // Overall sum from the top to    // right corner of matrix    int res = aux[rbi][rbj];         // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1][rbj];         // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi][tlj - 1];         // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res +           aux[tli - 1][tlj - 1];     return res;} // Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumint maximumSquareSize(int mat[N][M], int K){    int aux[N][M];    preProcess(mat, aux);         // Loop to choose the size of matrix    for (int i = min(N, M); i >= 1; i--) {         bool satisfies = true;                 // Loop to find the sum of the        // matrix of every possible submatrix        for (int x = 0; x < N; x++) {            for (int y = 0; y < M; y++) {                if (x + i - 1 <= N - 1 &&                     y + i - 1 <= M - 1) {                    if (sumQuery(aux, x, y,                   x + i - 1, y + i - 1) > K)                        satisfies = false;                }            }        }        if (satisfies == true)            return (i);    }    return 0;} // Driver Codeint main(){    int K = 30;    int mat[N][M] = { { 1, 2, 3, 4, 6 },                    { 5, 3, 8, 1, 2 },                    { 4, 6, 7, 5, 5 },                    { 2, 4, 8, 9, 4 } };     cout << maximumSquareSize(mat, K);    return 0;}

## Java

 // Java implementation to find the// maximum size square submatrix// such that their sum is less than Kclass GFG{  // Size of matrixstatic final int N = 4;static final int M = 5;  // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizestatic void preProcess(int [][]mat,                int [][]aux){    // Loop to copy the first row    // of the matrix into the aux matrix    for (int i = 0; i < M; i++)        aux[0][i] = mat[0][i];          // Computing the sum column-wise    for (int i = 1; i < N; i++)        for (int j = 0; j < M; j++)            aux[i][j] = mat[i][j] +                      aux[i - 1][j];      // Computing row wise sum    for (int i = 0; i < N; i++)        for (int j = 1; j < M; j++)            aux[i][j] += aux[i][j - 1];}  // Function to find the sum of a// submatrix with the given indicesstatic int sumQuery(int [][]aux, int tli,          int tlj, int rbi, int rbj){    // Overall sum from the top to    // right corner of matrix    int res = aux[rbi][rbj];          // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1][rbj];          // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi][tlj - 1];          // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res +           aux[tli - 1][tlj - 1];      return res;}  // Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumstatic int maximumSquareSize(int [][]mat, int K){    int [][]aux = new int[N][M];    preProcess(mat, aux);          // Loop to choose the size of matrix    for (int i = Math.min(N, M); i >= 1; i--) {          boolean satisfies = true;                  // Loop to find the sum of the        // matrix of every possible submatrix        for (int x = 0; x < N; x++) {            for (int y = 0; y < M; y++) {                if (x + i - 1 <= N - 1 &&                     y + i - 1 <= M - 1) {                    if (sumQuery(aux, x, y,                   x + i - 1, y + i - 1) > K)                        satisfies = false;                }            }        }        if (satisfies == true)            return (i);    }    return 0;}  // Driver Codepublic static void main(String[] args){    int K = 30;    int mat[][] = { { 1, 2, 3, 4, 6 },                    { 5, 3, 8, 1, 2 },                    { 4, 6, 7, 5, 5 },                    { 2, 4, 8, 9, 4 } };      System.out.print(maximumSquareSize(mat, K));}} // This code is contributed by PrinciRaj1992

## Python3

 # Python3 implementation to find the# maximum size square submatrix# such that their sum is less than K # Size of matrixN = 4M = 5 # Function to preprocess the matrix# for computing the sum of every# possible matrix of the given sizedef preProcess(mat, aux):     # Loop to copy the first row    # of the matrix into the aux matrix    for i in range (M):        aux[0][i] = mat[0][i]         # Computing the sum column-wise    for i in range (1, N):        for j in range (M):            aux[i][j] = (mat[i][j] +                         aux[i - 1][j])     # Computing row wise sum    for i in range (N):        for j in range (1, M):            aux[i][j] += aux[i][j - 1] # Function to find the sum of a# submatrix with the given indicesdef sumQuery(aux, tli, tlj, rbi, rbj):     # Overall sum from the top to    # right corner of matrix    res = aux[rbi][rbj]         # Removing the sum from the top    # corer of the matrix    if (tli > 0):        res = res - aux[tli - 1][rbj]         # Remove the overlapping sum    if (tlj > 0):        res = res - aux[rbi][tlj - 1]         # Add the sum of top corner    # which is substracted twice    if (tli > 0 and tlj > 0):        res = (res +        aux[tli - 1][tlj - 1])     return res # Function to find the maximum# square size possible with the# such that every submatrix have# sum less than the given sumdef maximumSquareSize(mat, K):     aux = [[0 for x in range (M)]              for y in range (N)]    preProcess(mat, aux)         # Loop to choose the size of matrix    for i in range (min(N, M), 0, -1):         satisfies = True                 # Loop to find the sum of the        # matrix of every possible submatrix        for x in range (N):            for y in range (M) :                if (x + i - 1 <= N - 1 and                    y + i - 1 <= M - 1):                    if (sumQuery(aux, x, y,                                 x + i - 1,                                 y + i - 1) > K):                        satisfies = False                     if (satisfies == True):            return (i)    return 0 # Driver Codeif __name__ == "__main__":     K = 30    mat = [[1, 2, 3, 4, 6],            [5, 3, 8, 1, 2],           [4, 6, 7, 5, 5],           [2, 4, 8, 9, 4]]     print( maximumSquareSize(mat, K)) # This code is contributed by Chitranayal

## C#

 // C# implementation to find the// maximum size square submatrix// such that their sum is less than Kusing System; public class GFG{   // Size of matrixstatic readonly int N = 4;static readonly int M = 5;   // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizestatic void preProcess(int [,]mat,                int [,]aux){    // Loop to copy the first row    // of the matrix into the aux matrix    for (int i = 0; i < M; i++)        aux[0,i] = mat[0,i];           // Computing the sum column-wise    for (int i = 1; i < N; i++)        for (int j = 0; j < M; j++)            aux[i,j] = mat[i,j] +                      aux[i - 1,j];       // Computing row wise sum    for (int i = 0; i < N; i++)        for (int j = 1; j < M; j++)            aux[i,j] += aux[i,j - 1];}   // Function to find the sum of a// submatrix with the given indicesstatic int sumQuery(int [,]aux, int tli,          int tlj, int rbi, int rbj){    // Overall sum from the top to    // right corner of matrix    int res = aux[rbi,rbj];           // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1,rbj];           // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi,tlj - 1];           // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res +           aux[tli - 1,tlj - 1];       return res;}   // Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumstatic int maximumSquareSize(int [,]mat, int K){    int [,]aux = new int[N,M];    preProcess(mat, aux);           // Loop to choose the size of matrix    for (int i = Math.Min(N, M); i >= 1; i--) {           bool satisfies = true;                   // Loop to find the sum of the        // matrix of every possible submatrix        for (int x = 0; x < N; x++) {            for (int y = 0; y < M; y++) {                if (x + i - 1 <= N - 1 &&                     y + i - 1 <= M - 1) {                    if (sumQuery(aux, x, y,                   x + i - 1, y + i - 1) > K)                        satisfies = false;                }            }        }        if (satisfies == true)            return (i);    }    return 0;}   // Driver Codepublic static void Main(String[] args){    int K = 30;    int [,]mat = { { 1, 2, 3, 4, 6 },                    { 5, 3, 8, 1, 2 },                    { 4, 6, 7, 5, 5 },                    { 2, 4, 8, 9, 4 } };       Console.Write(maximumSquareSize(mat, K));}}   // This code contributed by PrinciRaj1992
Output:

2

• Time complexity: O(N3)
• Auxiliary Space: O(N2)

Efficient Approach: The key observation is, if a square of side s is the maximum size satisfying the condition, then all sizes smaller than it will satisfy the condition. Using this we can reduce our search space at each step by half which is precisely the idea of Binary Search. Below is the illustration of the steps of the approach:

• Search Space: The search space for this problem will be from [1, min(N, M)]. That is the search space for binary search is defined as –
low = 1
high = min(N, M)
• Next Search Space: In each iteration find the mid of the search space and then Finally, check that all subarrays of that size have the sum less than K. If all subarrays of that size have sum less than K. Then the next search space possible will be in the right of the middle. Otherwise, the next search space possible will be in the left of the middle. That is less than the middle.
• Case 1: Condition when the all the subarrays of size mid have sum less than K. Then –
if checkSubmatrix(mat, mid, K):
low = mid + 1
• Case 2: Condition when the all the subarrays of size mid have sum greater than K. Then –
if not checkSubmatrix(mat, mid, K):
high = mid - 1

Below is the implementation of the above approach:

## C++

 // C++ implementation to find the// maximum size square submatrix// such that their sum is less than K #include  using namespace std; // Size of matrix#define N 4#define M 5 // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizevoid preProcess(int mat[N][M],                     int aux[N][M]){    // Loop to copy the first row    // of the matrix into the aux matrix    for (int i = 0; i < M; i++)        aux[0][i] = mat[0][i];     // Computing the sum column-wise    for (int i = 1; i < N; i++)        for (int j = 0; j < M; j++)            aux[i][j] = mat[i][j] +                       aux[i - 1][j];     // Computing row wise sum    for (int i = 0; i < N; i++)        for (int j = 1; j < M; j++)            aux[i][j] += aux[i][j - 1];} // Function to find the sum of a// submatrix with the given indicesint sumQuery(int aux[N][M], int tli,          int tlj, int rbi, int rbj){    // Overall sum from the top to    // right corner of matrix    int res = aux[rbi][rbj];     // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1][rbj];     // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi][tlj - 1];     // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res + aux[tli - 1][tlj - 1];     return res;} // Function to check whether square// sub matrices of size mid satisfy// the condition or notbool check(int mid, int aux[N][M],                           int K){     bool satisfies = true;         // Iterating throught all possible    // submatrices of given size    for (int x = 0; x < N; x++) {        for (int y = 0; y < M; y++) {            if (x + mid - 1 <= N - 1 &&                  y + mid - 1 <= M - 1) {                if (sumQuery(aux, x, y,          x + mid - 1, y + mid - 1) > K)                    satisfies = false;            }        }    }    return (satisfies == true);}// Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumint maximumSquareSize(int mat[N][M],                              int K){    int aux[N][M];     preProcess(mat, aux);         // Search space    int low = 1, high = min(N, M);    int mid;         // Binary search for size    while (high - low > 1) {        mid = (low + high) / 2;                 // Check if the mid satisfies        // the given condition        if (check(mid, aux, K)) {            low = mid;        }        else            high = mid;    }    if (check(high, aux, K))        return high;    return low;} // Driver Codeint main(){    int K = 30;    int mat[N][M] = { { 1, 2, 3, 4, 6 },                    { 5, 3, 8, 1, 2 },                    { 4, 6, 7, 5, 5 },                    { 2, 4, 8, 9, 4 } };     cout << maximumSquareSize(mat, K);    return 0;}

## Java

 // Java implementation to find the// maximum size square submatrix// such that their sum is less than Kclass GFG{ // Size of matrixstatic final int N = 4;static final int M = 5; // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizestatic void preProcess(int [][]mat,                       int [][]aux){         // Loop to copy the first row of    // the matrix into the aux matrix    for(int i = 0; i < M; i++)       aux[0][i] = mat[0][i];     // Computing the sum column-wise    for(int i = 1; i < N; i++)       for(int j = 0; j < M; j++)          aux[i][j] = mat[i][j] +                      aux[i - 1][j];     // Computing row wise sum    for(int i = 0; i < N; i++)       for(int j = 1; j < M; j++)          aux[i][j] += aux[i][j - 1];} // Function to find the sum of a// submatrix with the given indicesstatic int sumQuery(int [][]aux, int tli,                    int tlj, int rbi, int rbj){         // Overall sum from the top to    // right corner of matrix    int res = aux[rbi][rbj];     // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1][rbj];     // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi][tlj - 1];     // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res + aux[tli - 1][tlj - 1];     return res;} // Function to check whether square// sub matrices of size mid satisfy// the condition or notstatic boolean check(int mid, int [][]aux,                     int K){     boolean satisfies = true;         // Iterating throught all possible    // submatrices of given size    for(int x = 0; x < N; x++)    {       for(int y = 0; y < M; y++)       {          if (x + mid - 1 <= N - 1 &&              y + mid - 1 <= M - 1)          {              if (sumQuery(aux, x, y,                           x + mid - 1,                           y + mid - 1) > K)                  satisfies = false;          }       }    }    return (satisfies == true);} // Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumstatic int maximumSquareSize(int [][]mat,                             int K){    int [][]aux = new int[N][M];     preProcess(mat, aux);         // Search space    int low = 1, high = Math.min(N, M);    int mid;         // Binary search for size    while (high - low > 1)    {        mid = (low + high) / 2;                 // Check if the mid satisfies        // the given condition        if (check(mid, aux, K))        {            low = mid;        }        else            high = mid;    }    if (check(high, aux, K))        return high;    return low;} // Driver Codepublic static void main(String[] args){    int K = 30;    int [][]mat = { { 1, 2, 3, 4, 6 },                    { 5, 3, 8, 1, 2 },                    { 4, 6, 7, 5, 5 },                    { 2, 4, 8, 9, 4 } };     System.out.print(maximumSquareSize(mat, K));}} // This code is contributed by Rajput-Ji

## Python3

 # Python3 implementation to find the# maximum size square submatrix# such that their sum is less than K # Function to preprocess the matrix# for computing the sum of every# possible matrix of the given sizedef preProcess(mat, aux):         # Loop to copy the first row    # of the matrix into the aux matrix    for i in range(5):        aux[0][i] = mat[0][i]     # Computing the sum column-wise    for i in range(1, 4):        for j in range(5):            aux[i][j] = (mat[i][j] +                         aux[i - 1][j])     # Computing row wise sum    for i in range(4):        for j in range(1, 5):            aux[i][j] += aux[i][j - 1]                 return aux # Function to find the sum of a# submatrix with the given indicesdef sumQuery(aux, tli, tlj, rbi, rbj):         # Overall sum from the top to    # right corner of matrix    res = aux[rbi][rbj]     # Removing the sum from the top    # corer of the matrix    if (tli > 0):        res = res - aux[tli - 1][rbj]     # Remove the overlapping sum    if (tlj > 0):        res = res - aux[rbi][tlj - 1]     # Add the sum of top corner    # which is substracted twice    if (tli > 0 and tlj > 0):        res = res + aux[tli - 1][tlj - 1]     return res # Function to check whether square# sub matrices of size mid satisfy# the condition or notdef check(mid, aux, K):         satisfies = True     # Iterating throught all possible    # submatrices of given size    for x in range(4):        for y in range(5):            if (x + mid - 1 <= 4 - 1 and                y + mid - 1 <= 5 - 1):                if (sumQuery(aux, x, y,                             x + mid - 1,                             y + mid - 1) > K):                    satisfies = False                         return True if satisfies == True else False     # Function to find the maximum# square size possible with the# such that every submatrix have# sum less than the given sumdef maximumSquareSize(mat, K):         aux = [[0 for i in range(5)]              for i in range(4)]     aux = preProcess(mat, aux)     # Search space    low , high = 1, min(4, 5)    mid = 0     # Binary search for size    while (high - low > 1):        mid = (low + high) // 2         # Check if the mid satisfies        # the given condition        if (check(mid, aux, K)):            low = mid        else:            high = mid                 if (check(high, aux, K)):        return high             return low # Driver Codeif __name__ == '__main__':         K = 30         mat = [ [ 1, 2, 3, 4, 6 ],            [ 5, 3, 8, 1, 2 ],            [ 4, 6, 7, 5, 5 ],            [ 2, 4, 8, 9, 4 ] ]     print(maximumSquareSize(mat, K)) # This code is contributed by mohit kumar 29

## C#

 // C# implementation to find the// maximum size square submatrix// such that their sum is less than Kusing System; class GFG{ // Size of matrixstatic readonly int N = 4;static readonly int M = 5; // Function to preprocess the matrix// for computing the sum of every// possible matrix of the given sizestatic void preProcess(int [,]mat,                       int [,]aux){         // Loop to copy the first row of    // the matrix into the aux matrix    for(int i = 0; i < M; i++)       aux[0, i] = mat[0, i];     // Computing the sum column-wise    for(int i = 1; i < N; i++)       for(int j = 0; j < M; j++)          aux[i, j] = mat[i, j] +                      aux[i - 1, j];     // Computing row wise sum    for(int i = 0; i < N; i++)       for(int j = 1; j < M; j++)          aux[i, j] += aux[i, j - 1];} // Function to find the sum of a// submatrix with the given indicesstatic int sumQuery(int [,]aux, int tli,                    int tlj, int rbi, int rbj){         // Overall sum from the top to    // right corner of matrix    int res = aux[rbi, rbj];     // Removing the sum from the top    // corer of the matrix    if (tli > 0)        res = res - aux[tli - 1, rbj];     // Remove the overlapping sum    if (tlj > 0)        res = res - aux[rbi, tlj - 1];     // Add the sum of top corner    // which is substracted twice    if (tli > 0 && tlj > 0)        res = res + aux[tli - 1, tlj - 1];     return res;} // Function to check whether square// sub matrices of size mid satisfy// the condition or notstatic bool check(int mid, int [,]aux,                  int K){     bool satisfies = true;         // Iterating throught all possible    // submatrices of given size    for(int x = 0; x < N; x++)    {       for(int y = 0; y < M; y++)       {          if (x + mid - 1 <= N - 1 &&              y + mid - 1 <= M - 1)          {              if (sumQuery(aux, x, y,                           x + mid - 1,                           y + mid - 1) > K)                  satisfies = false;          }       }    }    return (satisfies == true);} // Function to find the maximum// square size possible with the// such that every submatrix have// sum less than the given sumstatic int maximumSquareSize(int [,]mat,                             int K){    int [,]aux = new int[N, M];     preProcess(mat, aux);         // Search space    int low = 1, high = Math.Min(N, M);    int mid;         // Binary search for size    while (high - low > 1)    {        mid = (low + high) / 2;                 // Check if the mid satisfies        // the given condition        if (check(mid, aux, K))        {            low = mid;        }        else            high = mid;    }    if (check(high, aux, K))        return high;    return low;} // Driver Codepublic static void Main(String[] args){    int K = 30;    int [,]mat = { { 1, 2, 3, 4, 6 },                   { 5, 3, 8, 1, 2 },                   { 4, 6, 7, 5, 5 },                   { 2, 4, 8, 9, 4 } };     Console.Write(maximumSquareSize(mat, K));}} // This code is contributed by Rajput-Ji
Output:
2

Performance Analysis:

• Time Complexity: O(N2 * log(N) )
• Auxiliary Space: O(N2)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up