Maximum size square Sub-Matrix with sum less than or equals to K
Last Updated :
19 Jul, 2021
Given a Matrix arr[][] of size M x N having positive integers and a number K, the task is to find the size of the largest square sub-matrix whose sum of elements is less than or equals to K.
Example:
Input:
arr[][] = { { 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 } },
K = 4
Output:
2
Explanation:
Maximum size square Sub-Matrix
with sum less than or equals to 4
1 1
1 1
Size is 2.
Input:
arr[][] = { { 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 } },
K = 22
Output:
3
Explanation:
Maximum size square Sub-Matrix
with sum less than or equals to 22
1 1 3
1 1 3
1 1 3
Size is 3.
Approach:
- For the given matrix arr[][] create a prefix sum matrix(say sum[][]) such that sum[i][j] stores the sum of all the elements of the matrix of size i x j.
- For each row in prefix sum matrix sum[][] using Binary Search do the following:
- Perform Binary search with the lower limit as 0 end the upper limit as to maximum size of square matrix.
- Find the middle index (say mid).
- If the sum of elements of all possible square matrix of size mid is less than or equals to K, then update the lower limit as mid + 1 to find the maximum sum with size greater than mid.
- Else Update the upper limit as mid – 1 to find the maximum sum with size less than mid.
- Keep updating the maximum size of square matrix in each iteration for the given valid condition above.
Below is the implementation of the above approach:
Java
import java.util.*;
class GFG {
static void findMaxMatrixSize( int [][] arr, int K)
{
int i, j;
int n = arr.length;
int m = arr[ 0 ].length;
int [][] sum = new int [n + 1 ][m + 1 ];
for (i = 0 ; i <= n; i++) {
for (j = 0 ; j <= m; j++) {
if (i == 0 || j == 0 ) {
sum[i][j] = 0 ;
continue ;
}
sum[i][j] = arr[i - 1 ][j - 1 ]
+ sum[i - 1 ][j] + sum[i][j - 1 ]
- sum[i - 1 ][j - 1 ];
}
}
int ans = 0 ;
for (i = 1 ; i <= n; i++) {
for (j = 1 ; j <= m; j++) {
if (i + ans - 1 > n || j + ans - 1 > m)
break ;
int mid, lo = ans;
int hi = Math.min(n - i + 1 , m - j + 1 );
while (lo < hi) {
mid = (hi + lo + 1 ) / 2 ;
if (sum[i + mid - 1 ][j + mid - 1 ]
+ sum[i - 1 ][j - 1 ]
- sum[i + mid - 1 ][j - 1 ]
- sum[i - 1 ][j + mid - 1 ]
<= K) {
lo = mid;
}
else {
hi = mid - 1 ;
}
}
ans = Math.max(ans, lo);
}
}
System.out.print(ans + "\n" );
}
public static void main(String[] args)
{
int [][] arr = { { 1 , 1 , 3 , 2 , 4 , 3 , 2 },
{ 1 , 1 , 3 , 2 , 4 , 3 , 2 },
{ 1 , 1 , 3 , 2 , 4 , 3 , 2 } };
int K = 4 ;
findMaxMatrixSize(arr, K);
}
}
|
Python3
def findMaxMatrixSize(arr, K):
n = len (arr)
m = len (arr[ 0 ])
sum = [[ 0 for i in range (m + 1 )] for j in range (n + 1 )]
for i in range (n + 1 ):
for j in range (m + 1 ):
if (i = = 0 or j = = 0 ):
sum [i][j] = 0
continue
sum [i][j] = arr[i - 1 ][j - 1 ] + sum [i - 1 ][j] + \
sum [i][j - 1 ] - sum [i - 1 ][j - 1 ]
ans = 0
for i in range ( 1 , n + 1 ):
for j in range ( 1 , m + 1 ):
if (i + ans - 1 > n or j + ans - 1 > m):
break
mid = ans
lo = ans
hi = min (n - i + 1 , m - j + 1 )
while (lo < hi):
mid = (hi + lo + 1 ) / / 2
if ( sum [i + mid - 1 ][j + mid - 1 ] +
sum [i - 1 ][j - 1 ] -
sum [i + mid - 1 ][j - 1 ] -
sum [i - 1 ][j + mid - 1 ] < = K):
lo = mid
else :
hi = mid - 1
ans = max (ans, lo)
print (ans)
if __name__ = = '__main__' :
arr = [[ 1 , 1 , 3 , 2 , 4 , 3 , 2 ],
[ 1 , 1 , 3 , 2 , 4 , 3 , 2 ],
[ 1 , 1 , 3 , 2 , 4 , 3 , 2 ]]
K = 4
findMaxMatrixSize(arr, K)
|
C#
using System;
class GFG {
static void findMaxMatrixSize( int [, ] arr, int K)
{
int i, j;
int n = arr.GetLength(0);
int m = arr.GetLength(1);
int [, ] sum = new int [n + 1, m + 1];
for (i = 0; i <= n; i++) {
for (j = 0; j <= m; j++) {
if (i == 0 || j == 0) {
sum[i, j] = 0;
continue ;
}
sum[i, j] = arr[i - 1, j - 1]
+ sum[i - 1, j] + sum[i, j - 1]
- sum[i - 1, j - 1];
}
}
int ans = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
if (i + ans - 1 > n || j + ans - 1 > m)
break ;
int mid, lo = ans;
int hi = Math.Min(n - i + 1, m - j + 1);
while (lo < hi) {
mid = (hi + lo + 1) / 2;
if (sum[i + mid - 1, j + mid - 1]
+ sum[i - 1, j - 1]
- sum[i + mid - 1, j - 1]
- sum[i - 1, j + mid - 1]
<= K) {
lo = mid;
}
else {
hi = mid - 1;
}
}
ans = Math.Max(ans, lo);
}
}
Console.Write(ans + "\n" );
}
public static void Main(String[] args)
{
int [, ] arr = { { 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 } };
int K = 4;
findMaxMatrixSize(arr, K);
}
}
|
Javascript
<script>
function findMaxMatrixSize(arr, K)
{
let i, j;
let n = arr.length;
let m = arr[0].length;
let sum=[];
for (i =0;i<n+1;i++){
sum[i] = [];
for (j =0;j<m+1;j++){
sum[i][j] = 0;
}
}
for ( i = 0; i <= n; i++) {
for (j = 0; j <= m; j++) {
if (i == 0 || j == 0) {
sum[i][j] = 0;
continue ;
}
sum[i][j] = arr[i - 1][j - 1] + sum[i - 1][j]
+ sum[i][j - 1] - sum[i - 1][j - 1];
}
}
let ans = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
if (i + ans - 1 > n || j + ans - 1 > m)
break ;
let mid, lo = ans;
let hi = Math.min(n - i + 1, m - j + 1);
while (lo < hi) {
mid = Math.floor((hi + lo + 1) / 2);
if (sum[i + mid - 1][j + mid - 1]
+ sum[i - 1][j - 1]
- sum[i + mid - 1][j - 1]
- sum[i - 1][j + mid - 1]
<= K) {
lo = mid;
}
else {
hi = mid - 1;
}
}
ans = Math.max(ans, lo);
}
}
document.write(ans , '<br>' );
}
let arr = [[ 1, 1, 3, 2, 4, 3, 2 ],
[ 1, 1, 3, 2, 4, 3, 2 ],
[ 1, 1, 3, 2, 4, 3, 2 ]];
let K = 4;
findMaxMatrixSize(arr, K);
</script>
|
C++
#include <bits/stdc++.h>
using namespace std;
void findMaxMatrixSize(vector<vector< int > > arr, int K)
{
int i, j;
int n = arr.size();
int m = arr[0].size();
int sum[n + 1][m + 1];
for ( int i = 0; i <= n; i++) {
for ( int j = 0; j <= m; j++) {
if (i == 0 || j == 0) {
sum[i][j] = 0;
continue ;
}
sum[i][j] = arr[i - 1][j - 1] + sum[i - 1][j]
+ sum[i][j - 1] - sum[i - 1][j - 1];
}
}
int ans = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
if (i + ans - 1 > n || j + ans - 1 > m)
break ;
int mid, lo = ans;
int hi = min(n - i + 1, m - j + 1);
while (lo < hi) {
mid = (hi + lo + 1) / 2;
if (sum[i + mid - 1][j + mid - 1]
+ sum[i - 1][j - 1]
- sum[i + mid - 1][j - 1]
- sum[i - 1][j + mid - 1]
<= K) {
lo = mid;
}
else {
hi = mid - 1;
}
}
ans = max(ans, lo);
}
}
cout << ans << endl;
}
int main()
{
vector<vector< int > > arr;
arr = { { 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 },
{ 1, 1, 3, 2, 4, 3, 2 } };
int K = 4;
findMaxMatrixSize(arr, K);
return 0;
}
|
Time Complexity: O(N*N*log(N))
Auxiliary Space: O(M*N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...