Given an n x n square matrix, find sum of all sub-squares of size k x k where k is smaller than or equal to n.
Examples :
Input: n = 5, k = 3 arr[][] = { {1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3}, {4, 4, 4, 4, 4}, {5, 5, 5, 5, 5}, }; Output: 18 18 18 27 27 27 36 36 36 Input: n = 3, k = 2 arr[][] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, }; Output: 12 16 24 28
A Simple Solution is to one by one pick starting point (leftmost-topmost corner) of all possible sub-squares. Once the starting point is picked, calculate sum of sub-square starting with the picked starting point.
Following is the implementation of this idea.
// A simple C++ program to find sum of all subsquares of // size k x k #include <iostream> using namespace std;
// Size of given matrix #define n 5 // A simple function to find sum of all sub-squares of size // k x k in a given square matrix of size n x n void printSumSimple( int mat[][n], int k)
{ // k must be smaller than or equal to n
if (k > n)
return ;
// row number of first cell in current sub-square of
// size k x k
for ( int i = 0; i < n - k + 1; i++) {
// column of first cell in current sub-square of
// size k x k
for ( int j = 0; j < n - k + 1; j++) {
// Calculate and print sum of current sub-square
int sum = 0;
for ( int p = i; p < k + i; p++)
for ( int q = j; q < k + j; q++)
sum += mat[p][q];
cout << sum << " " ;
}
// Line separator for sub-squares starting with next
// row
cout << endl;
}
} // Driver program to test above function int main()
{ int mat[n][n] = {
{ 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },
{ 3, 3, 3, 3, 3 }, { 4, 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5 },
};
int k = 3;
printSumSimple(mat, k);
return 0;
} // This code is contributed by Aditya Kumar (adityakumar129) |
// A simple C program to find sum of all subsquares of // size k x k #include <stdio.h> // Size of given matrix #define n 5 // A simple function to find sum of all sub-squares of size // k x k in a given square matrix of size n x n void printSumSimple( int mat[][n], int k)
{ // k must be smaller than or equal to n
if (k > n)
return ;
// row number of first cell in current sub-square of
// size k x k
for ( int i = 0; i < n - k + 1; i++) {
// column of first cell in current sub-square of
// size k x k
for ( int j = 0; j < n - k + 1; j++) {
// Calculate and print sum of current sub-square
int sum = 0;
for ( int p = i; p < k + i; p++)
for ( int q = j; q < k + j; q++)
sum += mat[p][q];
printf ( "%d " , sum);
}
// Line separator for sub-squares starting with next
// row
printf ( "\n" );
}
} // Driver program to test above function int main()
{ int mat[n][n] = {
{ 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },
{ 3, 3, 3, 3, 3 }, { 4, 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5 },
};
int k = 3;
printSumSimple(mat, k);
return 0;
} // This code is contributed by Aditya Kumar (adityakumar129) |
// A simple Java program to find sum of all // subsquares of size k x k import java.io.*;
class GFG {
// Size of given matrix
static final int n = 5 ;
// A simple function to find sum of all
// sub-squares of size k x k in a given
// square matrix of size n x n
static void printSumSimple( int mat[][], int k)
{
// k must be smaller than or equal to n
if (k > n)
return ;
// row number of first cell in current sub-square of
// size k x k
for ( int i = 0 ; i < n - k + 1 ; i++) {
// column of first cell in current sub-square of
// size k x k
for ( int j = 0 ; j < n - k + 1 ; j++) {
// Calculate and print sum of current
// sub-square
int sum = 0 ;
for ( int p = i; p < k + i; p++)
for ( int q = j; q < k + j; q++)
sum += mat[p][q];
System.out.print(sum + " " );
}
// Line separator for sub-squares starting with
// next row
System.out.println();
}
}
// Driver Program to test above function
public static void main(String arg[])
{
int mat[][] = { { 1 , 1 , 1 , 1 , 1 },
{ 2 , 2 , 2 , 2 , 2 },
{ 3 , 3 , 3 , 3 , 3 },
{ 4 , 4 , 4 , 4 , 4 },
{ 5 , 5 , 5 , 5 , 5 } };
int k = 3 ;
printSumSimple(mat, k);
}
} // This code is contributed by Aditya Kumar (adityakumar129) |
# A simple Python 3 program to find sum # of all subsquares of size k x k # Size of given matrix n = 5
# A simple function to find sum of all # sub-squares of size k x k in a given # square matrix of size n x n def printSumSimple(mat, k):
# k must be smaller than or equal to n
if (k > n):
return
# row number of first cell in current
# sub-square of size k x k
for i in range (n - k + 1 ):
# column of first cell in current
# sub-square of size k x k
for j in range (n - k + 1 ):
# Calculate and print sum of
# current sub-square
sum = 0
for p in range (i, k + i):
for q in range (j, k + j):
sum + = mat[p][q]
print ( sum , end = " " )
# Line separator for sub-squares
# starting with next row
print ()
# Driver Code if __name__ = = "__main__" :
mat = [[ 1 , 1 , 1 , 1 , 1 ],
[ 2 , 2 , 2 , 2 , 2 ],
[ 3 , 3 , 3 , 3 , 3 ],
[ 4 , 4 , 4 , 4 , 4 ],
[ 5 , 5 , 5 , 5 , 5 ]]
k = 3
printSumSimple(mat, k)
# This code is contributed by ita_c |
// A simple C# program to find sum of all // subsquares of size k x k using System;
class GFG
{ // Size of given matrix
static int n = 5;
// A simple function to find sum of all
//sub-squares of size k x k in a given
// square matrix of size n x n
static void printSumSimple( int [,]mat, int k)
{
// k must be smaller than or
// equal to n
if (k > n) return ;
// row number of first cell in
// current sub-square of size k x k
for ( int i = 0; i < n-k+1; i++)
{
// column of first cell in current
// sub-square of size k x k
for ( int j = 0; j < n-k+1; j++)
{
// Calculate and print sum of
// current sub-square
int sum = 0;
for ( int p = i; p < k+i; p++)
for ( int q = j; q < k+j; q++)
sum += mat[p,q];
Console.Write(sum+ " " );
}
// Line separator for sub-squares
// starting with next row
Console.WriteLine();
}
}
// Driver Program to test above function
public static void Main()
{
int [,]mat = {{1, 1, 1, 1, 1},
{2, 2, 2, 2, 2},
{3, 3, 3, 3, 3},
{4, 4, 4, 4, 4},
{5, 5, 5, 5, 5}};
int k = 3;
printSumSimple(mat, k);
}
} // This code is contributed by Sam007 |
<?php // A simple PHP program to find // sum of all subsquares of size // k x k // Size of given matrix $n = 5;
// function to find sum of all sub - // squares of size k x k in a given // square matrix of size n x n function printSumSimple( $mat , $k )
{ global $n ;
// k must be smaller than
// or equal to n
if ( $k > $n ) return ;
// row number of first cell in
// current sub-square of size
// k x k
for ( $i = 0; $i < $n - $k + 1; $i ++)
{
// column of first cell in
// current sub-square of size
// k x k
for ( $j = 0; $j < $n - $k + 1; $j ++)
{
// Calculate and print sum of
// current sub-square
$sum = 0;
for ( $p = $i ; $p < $k + $i ; $p ++)
for ( $q = $j ; $q < $k + $j ; $q ++)
$sum += $mat [ $p ][ $q ];
echo $sum , " " ;
}
// Line separator for sub-squares
// starting with next row
echo "\n" ;
}
} // Driver Code
$mat = array ( array (1, 1, 1, 1, 1),
array (2, 2, 2, 2, 2,),
array (3, 3, 3, 3, 3,),
array (4, 4, 4, 4, 4,),
array (5, 5, 5, 5, 5));
$k = 3;
printSumSimple( $mat , $k );
// This code is contributed by anuj_67. ?> |
<script> // A simple Javascript program to find sum of all // subsquares of size k x k // Size of given matrix
let n = 5;
// A simple function to find sum of all
//sub-squares of size k x k in a given
// square matrix of size n x n
function printSumSimple(mat,k)
{
// k must be smaller than or
// equal to n
if (k > n) return ;
// row number of first cell in
// current sub-square of size k x k
for (let i = 0; i < n-k+1; i++)
{
// column of first cell in current
// sub-square of size k x k
for (let j = 0; j < n-k+1; j++)
{
// Calculate and print sum of
// current sub-square
let sum = 0;
for (let p = i; p < k+i; p++)
for (let q = j; q < k+j; q++)
sum += mat[p][q];
document.write(sum+ " " );
}
// Line separator for sub-squares
// starting with next row
document.write( "<br>" );
}
}
// Driver Program to test above function
let mat=[[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4],
[5, 5, 5, 5, 5]]
let k = 3;
printSumSimple(mat, k);
// This code is contributed by avanitrachhadiya2155
</script> |
18 18 18 27 27 27 36 36 36
Time complexity: O(k2n2).
Auxiliary Space: O(1)
We can solve this problem in O(n2) time using a Tricky Solution.
The idea is to preprocess the given square matrix. In the preprocessing step, calculate sum of all vertical strips of size k x 1 in a temporary square matrix stripSum[][]. Once we have sum of all vertical strips, we can calculate sum of first sub-square in a row as sum of first k strips in that row, and for remaining sub-squares, we can calculate sum in O(1) time by removing the leftmost strip of previous subsquare and adding the rightmost strip of new square.
Following is the implementation of this idea.
// An efficient C++ program to find sum of all subsquares of // size k x k #include <iostream> using namespace std;
// Size of given matrix #define n 5 // A O(n^2) function to find sum of all sub-squares of size // k x k in a given square matrix of size n x n void printSumTricky( int mat[][n], int k)
{ // k must be smaller than or equal to n
if (k > n)
return ;
// 1: PREPROCESSING
// To store sums of all strips of size k x 1
int stripSum[n][n];
// Go column by column
for ( int j = 0; j < n; j++) {
// Calculate sum of first k x 1 rectangle in this
// column
int sum = 0;
for ( int i = 0; i < k; i++)
sum += mat[i][j];
stripSum[0][j] = sum;
// Calculate sum of remaining rectangles
for ( int i = 1; i < n - k + 1; i++) {
sum += (mat[i + k - 1][j] - mat[i - 1][j]);
stripSum[i][j] = sum;
}
}
// 2: CALCULATE SUM of Sub-Squares using stripSum[][]
for ( int i = 0; i < n - k + 1; i++) {
// Calculate and print sum of first subsquare in
// this row
int sum = 0;
for ( int j = 0; j < k; j++)
sum += stripSum[i][j];
cout << sum << " " ;
// Calculate sum of remaining squares in current row
// by removing the leftmost strip of previous
// sub-square and adding a new strip
for ( int j = 1; j < n - k + 1; j++) {
sum += (stripSum[i][j + k - 1]
- stripSum[i][j - 1]);
cout << sum << " " ;
}
cout << endl;
}
} // Driver program to test above function int main()
{ int mat[n][n] = {
{ 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },
{ 3, 3, 3, 3, 3 }, { 4, 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5 },
};
int k = 3;
printSumTricky(mat, k);
return 0;
} // This code is contributed by Aditya Kumar (adityakumar129) |
// An efficient C program to find sum of all subsquares of // size k x k #include <stdio.h> // Size of given matrix #define n 5 // A O(n^2) function to find sum of all sub-squares of size // k x k in a given square matrix of size n x n void printSumTricky( int mat[][n], int k)
{ // k must be smaller than or equal to n
if (k > n)
return ;
// 1: PREPROCESSING
// To store sums of all strips of size k x 1
int stripSum[n][n];
// Go column by column
for ( int j = 0; j < n; j++) {
// Calculate sum of first k x 1 rectangle in this
// column
int sum = 0;
for ( int i = 0; i < k; i++)
sum += mat[i][j];
stripSum[0][j] = sum;
// Calculate sum of remaining rectangles
for ( int i = 1; i < n - k + 1; i++) {
sum += (mat[i + k - 1][j] - mat[i - 1][j]);
stripSum[i][j] = sum;
}
}
// 2: CALCULATE SUM of Sub-Squares using stripSum[][]
for ( int i = 0; i < n - k + 1; i++) {
// Calculate and print sum of first subsquare in
// this row
int sum = 0;
for ( int j = 0; j < k; j++)
sum += stripSum[i][j];
printf ( "%d " , sum);
// Calculate sum of remaining squares in current row
// by removing the leftmost strip of previous
// sub-square and adding a new strip
for ( int j = 1; j < n - k + 1; j++) {
sum += (stripSum[i][j + k - 1]
- stripSum[i][j - 1]);
printf ( "%d " , sum);
}
printf ( "\n" );
}
} // Driver program to test above function int main()
{ int mat[n][n] = {
{ 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },
{ 3, 3, 3, 3, 3 }, { 4, 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5 },
};
int k = 3;
printSumTricky(mat, k);
return 0;
} // This code is contributed by Aditya Kumar (adityakumar129) |
// An efficient Java program to find sum of all subsquares // of size k x k import java.io.*;
class GFG {
// Size of given matrix
static int n = 5 ;
// A O(n^2) function to find sum of all sub-squares of
// size k x k in a given square matrix of size n x n
static void printSumTricky( int mat[][], int k)
{
// k must be smaller than or equal to n
if (k > n)
return ;
// 1: PREPROCESSING
// To store sums of all strips of size k x 1
int stripSum[][] = new int [n][n];
// Go column by column
for ( int j = 0 ; j < n; j++) {
// Calculate sum of first k x 1 rectangle in
// this column
int sum = 0 ;
for ( int i = 0 ; i < k; i++)
sum += mat[i][j];
stripSum[ 0 ][j] = sum;
// Calculate sum of remaining rectangles
for ( int i = 1 ; i < n - k + 1 ; i++) {
sum += (mat[i + k - 1 ][j] - mat[i - 1 ][j]);
stripSum[i][j] = sum;
}
}
// 2: CALCULATE SUM of Sub-Squares
// using stripSum[][]
for ( int i = 0 ; i < n - k + 1 ; i++) {
// Calculate and print sum of first
// subsquare in this row
int sum = 0 ;
for ( int j = 0 ; j < k; j++)
sum += stripSum[i][j];
System.out.print(sum + " " );
// Calculate sum of remaining squares in current
// row by removing the leftmost strip of
// previous sub-square and adding a new strip
for ( int j = 1 ; j < n - k + 1 ; j++) {
sum += (stripSum[i][j + k - 1 ]
- stripSum[i][j - 1 ]);
System.out.print(sum + " " );
}
System.out.println();
}
}
// Driver program to test above function
public static void main(String[] args)
{
int mat[][] = {
{ 1 , 1 , 1 , 1 , 1 }, { 2 , 2 , 2 , 2 , 2 },
{ 3 , 3 , 3 , 3 , 3 }, { 4 , 4 , 4 , 4 , 4 },
{ 5 , 5 , 5 , 5 , 5 },
};
int k = 3 ;
printSumTricky(mat, k);
}
} // This code is contributed by Aditya Kumar (adityakumar129) |
# An efficient Python3 program to find sum # of all subsquares of size k x k # A O(n^2) function to find sum of all # sub-squares of size k x k in a given # square matrix of size n x n def printSumTricky(mat, k):
global n
# k must be smaller than or
# equal to n
if k > n:
return
# 1: PREPROCESSING
# To store sums of all strips of size k x 1
stripSum = [[ None ] * n for i in range (n)]
# Go column by column
for j in range (n):
# Calculate sum of first k x 1
# rectangle in this column
Sum = 0
for i in range (k):
Sum + = mat[i][j]
stripSum[ 0 ][j] = Sum
# Calculate sum of remaining rectangles
for i in range ( 1 , n - k + 1 ):
Sum + = (mat[i + k - 1 ][j] -
mat[i - 1 ][j])
stripSum[i][j] = Sum
# 2: CALCULATE SUM of Sub-Squares
# using stripSum[][]
for i in range (n - k + 1 ):
# Calculate and print sum of first
# subsquare in this row
Sum = 0
for j in range (k):
Sum + = stripSum[i][j]
print ( Sum , end = " " )
# Calculate sum of remaining squares
# in current row by removing the leftmost
# strip of previous sub-square and adding
# a new strip
for j in range ( 1 , n - k + 1 ):
Sum + = (stripSum[i][j + k - 1 ] -
stripSum[i][j - 1 ])
print ( Sum , end = " " )
print ()
# Driver Code n = 5
mat = [[ 1 , 1 , 1 , 1 , 1 ],
[ 2 , 2 , 2 , 2 , 2 ],
[ 3 , 3 , 3 , 3 , 3 ],
[ 4 , 4 , 4 , 4 , 4 ],
[ 5 , 5 , 5 , 5 , 5 ]]
k = 3
printSumTricky(mat, k) # This code is contributed by PranchalK |
// An efficient C# program to find // sum of all subsquares of size k x k using System;
class GFG {
// Size of given matrix
static int n = 5;
// A O(n^2) function to find sum of all
// sub-squares of size k x k in a given
// square matrix of size n x n
static void printSumTricky( int [,]mat, int k)
{
// k must be smaller than or equal to n
if (k > n)
return ;
// 1: PREPROCESSING
// To store sums of all strips of
// size k x 1
int [,]stripSum = new int [n,n];
// Go column by column
for ( int j = 0; j < n; j++)
{
// Calculate sum of first k x 1
// rectangle in this column
int sum = 0;
for ( int i = 0; i < k; i++)
sum += mat[i,j];
stripSum[0,j] = sum;
// Calculate sum of remaining
// rectangles
for ( int i = 1; i < n - k + 1; i++)
{
sum += (mat[i + k - 1,j]
- mat[i - 1,j]);
stripSum[i,j] = sum;
}
}
// 2: CALCULATE SUM of Sub-Squares
// using stripSum[][]
for ( int i = 0; i < n - k + 1; i++)
{
// Calculate and print sum of first
// subsquare in this row
int sum = 0;
for ( int j = 0; j < k; j++)
sum += stripSum[i,j];
Console.Write(sum + " " );
// Calculate sum of remaining
// squares in current row by
// removing the leftmost strip
// of previous sub-square
// and adding a new strip
for ( int j = 1; j < n - k + 1; j++)
{
sum += (stripSum[i,j + k - 1]
- stripSum[i,j - 1]);
Console.Write(sum + " " );
}
Console.WriteLine();
}
}
// Driver program to test above function
public static void Main()
{
int [,]mat = {{1, 1, 1, 1, 1},
{2, 2, 2, 2, 2},
{3, 3, 3, 3, 3},
{4, 4, 4, 4, 4},
{5, 5, 5, 5, 5},
};
int k = 3;
printSumTricky(mat, k);
}
} // This code is contributed by nitin mittal. |
<?php // An efficient PHP program to // find sum of all subsquares // of size k x k // Size of given matrix $n = 5;
// A O(n^2) function to find // sum of all sub-squares of // size k x k in a given // square matrix of size n x n function printSumTricky( $mat , $k )
{ global $n ;
// k must be smaller // than or equal to n if ( $k > $n ) return ;
// 1: PREPROCESSING // To store sums of all // strips of size k x 1 $stripSum = array ( array ());
// Go column by column for ( $j = 0; $j < $n ; $j ++)
{ // Calculate sum of first
// k x 1 rectangle in this column
$sum = 0;
for ( $i = 0; $i < $k ; $i ++)
$sum += $mat [ $i ][ $j ];
$stripSum [0][ $j ] = $sum ;
// Calculate sum of
// remaining rectangles
for ( $i = 1; $i < $n - $k + 1; $i ++)
{
$sum += ( $mat [ $i + $k - 1][ $j ] -
$mat [ $i - 1][ $j ]);
$stripSum [ $i ][ $j ] = $sum ;
}
} // 2: CALCULATE SUM of // Sub-Squares using stripSum[][] for ( $i = 0; $i < $n - $k + 1; $i ++)
{ // Calculate and print sum of
// first subsquare in this row
$sum = 0;
for ( $j = 0; $j < $k ; $j ++)
$sum += $stripSum [ $i ][ $j ];
echo $sum , " " ;
// Calculate sum of remaining
// squares in current row by
// removing the leftmost strip
// of previous sub-square and
// adding a new strip
for ( $j = 1; $j < $n - $k + 1; $j ++)
{
$sum += ( $stripSum [ $i ][ $j + $k - 1] -
$stripSum [ $i ][ $j - 1]);
echo $sum , " " ;
}
echo "\n" ;
} } // Driver Code $mat = array ( array (1, 1, 1, 1, 1),
array (2, 2, 2, 2, 2),
array (3, 3, 3, 3, 3),
array (4, 4, 4, 4, 4),
array (5, 5, 5, 5, 5));
$k = 3;
printSumTricky( $mat , $k );
// This code is contributed by anuj_67. ?> |
<script> // An efficient Javascript program to find // sum of all subsquares of size k x k // Size of given matrix let n = 5; // A O(n^2) function to find sum of all // sub-squares of size k x k in a given // square matrix of size n x n function printSumTricky(mat, k)
{ // k must be smaller than or equal to n
if (k > n)
return ;
// 1: PREPROCESSING
// To store sums of all strips of size k x 1
let stripSum = new Array(n);
for (let i = 0; i < n; i++)
{
stripSum[i] = new Array(n);
}
for (let i = 0; i < n; i++)
{
for (let j = 0; j < n; j++)
{
stripSum[i][j] = 0;
}
}
// Go column by column
for (let j = 0; j < n; j++)
{
// Calculate sum of first k x 1
// rectangle in this column
let sum = 0;
for (let i = 0; i < k; i++)
sum += mat[i][j];
stripSum[0][j] = sum;
// Calculate sum of remaining rectangles
for (let i = 1; i < n - k + 1; i++)
{
sum += (mat[i + k - 1][j] - mat[i - 1][j]);
stripSum[i][j] = sum;
}
}
// 2: CALCULATE SUM of Sub-Squares
// using stripSum[][]
for (let i = 0; i < n - k + 1; i++)
{
// Calculate and print sum of first
// subsquare in this row
let sum = 0;
for (let j = 0; j < k; j++)
sum += stripSum[i][j];
document.write(sum + " " );
// Calculate sum of remaining squares
// in current row by removing the
// leftmost strip of previous sub-square
// and adding a new strip
for (let j = 1; j < n - k + 1; j++)
{
sum += (stripSum[i][j + k - 1] -
stripSum[i][j - 1]);
document.write(sum + " " );
}
document.write( "<br>" );
}
} // Driver code let mat = [ [ 1, 1, 1, 1, 1 ], [ 2, 2, 2, 2, 2 ],
[ 3, 3, 3, 3, 3 ],
[ 4, 4, 4, 4, 4 ],
[ 5, 5, 5, 5, 5 ] ];
let k = 3; printSumTricky(mat, k); // This code is contributed by rag2127 </script> |
18 18 18 27 27 27 36 36 36
Time complexity: O(n2).
Auxiliary Space: O(n2).