Given a square matrix, find the maximum product of four adjacent elements of the matrix. The adjacent elements of the matrix can be top, down, left, right, diagonal, or anti-diagonal. The four or more numbers should be adjacent to each other.
Note: n should be greater than or equal to 4 i.e n >= 4
Examples :
Input : n = 4
{{6, 2, 3 4},
{5, 4, 3, 1},
{7, 4, 5, 6},
{8, 3, 1, 0}}
Output : 1680
Explanation:
Multiplication of 6 5 7 8 produces maximum result and all element are adjacent to each other in one directionInput : n = 5
{{1, 2, 3, 4, 5},
{6, 7, 8, 9, 1},
{2, 3, 4, 5, 6},
{7, 8, 9, 1, 0},
{9, 6, 4, 2, 3}}
Output: 3024
Explanation: Multiplication of 6 7 8 9 produces maximum result and all elements are adjacent to each other in one direction.
Asked in: Tolexo
Approach:
- Group 4 elements that are adjacent to each other in each row and calculate their maximum result.
- Group 4 elements that are adjacent to each other in each column and calculate their maximum results.
- Group 4 elements that are adjacent to each other in diagonal and calculate their maximum results.
- Group 4 elements that are adjacent to each other in anti-diagonal and calculate their maximum results.
- Compare all calculated maximum results.
Below is the implementation of the above approach:
// C++ program to find out the maximum product // in the matrix which four elements are // adjacent to each other in one direction #include <bits/stdc++.h> using namespace std;
const int n = 5;
// function to find max product int FindMaxProduct( int arr[][n], int n)
{ int max = 0, result;
// iterate the rows.
for ( int i = 0; i < n; i++)
{
// iterate the columns.
for ( int j = 0; j < n; j++)
{
// check the maximum product
// in horizontal row.
if ((j - 3) >= 0)
{
result = arr[i][j] * arr[i][j - 1] *
arr[i][j - 2] * arr[i][j - 3];
if (max < result)
max = result;
}
// check the maximum product
// in vertical row.
if ((i - 3) >= 0)
{
result = arr[i][j] * arr[i - 1][j] *
arr[i - 2][j] * arr[i - 3][j];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through down - right)
if ((i - 3) >= 0 && (j - 3) >= 0)
{
result = arr[i][j] * arr[i - 1][j - 1] *
arr[i - 2][j - 2] * arr[i - 3][j - 3];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through up - right)
if ((i - 3) >= 0 && (j - 3) <= 0)
{
result = arr[i][j] * arr[i - 1][j + 1] *
arr[i - 2][j + 2] * arr[i - 3][j + 3];
if (max < result)
max = result;
}
}
}
return max;
} // Driver code int main()
{ /* int arr[][4] = {{6, 2, 3, 4},
{5, 4, 3, 1},
{7, 4, 5, 6},
{8, 3, 1, 0}};*/
/* int arr[][5] = {{1, 2, 1, 3, 4},
{5, 6, 3, 9, 2},
{7, 8, 8, 1, 2},
{1, 0, 7, 9, 3},
{3, 0, 8, 4, 9}};*/
int arr[][5] = {{1, 2, 3, 4, 5},
{6, 7, 8, 9, 1},
{2, 3, 4, 5, 6},
{7, 8, 9, 1, 0},
{9, 6, 4, 2, 3}};
cout << FindMaxProduct(arr, n);
return 0;
} |
// Java program to find out the // maximum product in the matrix // which four elements are adjacent // to each other in one direction class GFG {
static final int n = 5 ;
// function to find max product
static int FindMaxProduct( int arr[][], int n)
{
int max = 0 , result;
// iterate the rows.
for ( int i = 0 ; i < n; i++)
{
// iterate the columns.
for ( int j = 0 ; j < n; j++)
{
// check the maximum product
// in horizontal row.
if ((j - 3 ) >= 0 )
{
result = arr[i][j] * arr[i][j - 1 ]
* arr[i][j - 2 ]
* arr[i][j - 3 ];
if (max < result)
max = result;
}
// check the maximum product
// in vertical row.
if ((i - 3 ) >= 0 )
{
result = arr[i][j] * arr[i - 1 ][j]
* arr[i - 2 ][j]
* arr[i - 3 ][j];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through down - right)
if ((i - 3 ) >= 0 && (j - 3 ) >= 0 )
{
result = arr[i][j] * arr[i - 1 ][j - 1 ]
* arr[i - 2 ][j - 2 ]
* arr[i - 3 ][j - 3 ];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through up - right)
if ((i - 3 ) >= 0 && (j - 3 ) <= 0 )
{
result = arr[i][j] * arr[i - 1 ][j + 1 ]
* arr[i - 2 ][j + 2 ]
* arr[i - 3 ][j + 3 ];
if (max < result)
max = result;
}
}
}
return max;
}
// Driver code
public static void main(String[] args)
{
/* int arr[][4] = {{6, 2, 3, 4},
{5, 4, 3, 1},
{7, 4, 5, 6},
{8, 3, 1, 0}};*/
/* int arr[][5] = {{1, 2, 1, 3, 4},
{5, 6, 3, 9, 2},
{7, 8, 8, 1, 2},
{1, 0, 7, 9, 3},
{3, 0, 8, 4, 9}};*/
int arr[][] = { { 1 , 2 , 3 , 4 , 5 },
{ 6 , 7 , 8 , 9 , 1 },
{ 2 , 3 , 4 , 5 , 6 },
{ 7 , 8 , 9 , 1 , 0 },
{ 9 , 6 , 4 , 2 , 3 } };
System.out.print(FindMaxProduct(arr, n));
}
} // This code is contributed by Anant Agarwal. |
# Python3 program to find out the maximum # product in the matrix which four elements # are adjacent to each other in one direction n = 5
# function to find max product def FindMaxProduct(arr, n):
max = 0
# iterate the rows.
for i in range (n):
# iterate the columns.
for j in range ( n):
# check the maximum product
# in horizontal row.
if ((j - 3 ) > = 0 ):
result = (arr[i][j] * arr[i][j - 1 ] *
arr[i][j - 2 ] * arr[i][j - 3 ])
if ( max < result):
max = result
# check the maximum product
# in vertical row.
if ((i - 3 ) > = 0 ) :
result = (arr[i][j] * arr[i - 1 ][j] *
arr[i - 2 ][j] * arr[i - 3 ][j])
if ( max < result):
max = result
# check the maximum product in
# diagonal going through down - right
if ((i - 3 ) > = 0 and (j - 3 ) > = 0 ):
result = (arr[i][j] * arr[i - 1 ][j - 1 ] *
arr[i - 2 ][j - 2 ] * arr[i - 3 ][j - 3 ])
if ( max < result):
max = result
# check the maximum product in
# diagonal going through up - right
if ((i - 3 ) > = 0 and (j - 3 ) < = 0 ):
result = (arr[i][j] * arr[i - 1 ][j + 1 ] *
arr[i - 2 ][j + 2 ] * arr[i - 3 ][j + 3 ])
if ( max < result):
max = result
return max
# Driver code if __name__ = = "__main__" :
# int arr[][4] = {{6, 2, 3, 4},
# {5, 4, 3, 1},
# {7, 4, 5, 6},
# {8, 3, 1, 0}};
# int arr[][5] = {{1, 2, 1, 3, 4},
# {5, 6, 3, 9, 2},
# {7, 8, 8, 1, 2},
# {1, 0, 7, 9, 3},
# {3, 0, 8, 4, 9}};
arr = [[ 1 , 2 , 3 , 4 , 5 ],
[ 6 , 7 , 8 , 9 , 1 ],
[ 2 , 3 , 4 , 5 , 6 ],
[ 7 , 8 , 9 , 1 , 0 ],
[ 9 , 6 , 4 , 2 , 3 ]]
print (FindMaxProduct(arr, n))
# This code is contributed by ita_c |
// C# program to find out the // maximum product in the matrix // which four elements are adjacent // to each other in one direction using System;
public class GFG {
static int n = 5;
// Function to find max product
static int FindMaxProduct( int [, ] arr, int n)
{
int max = 0, result;
// iterate the rows
for ( int i = 0; i < n; i++) {
// iterate the columns
for ( int j = 0; j < n; j++) {
// check the maximum product
// in horizontal row.
if ((j - 3) >= 0) {
result = arr[i, j] * arr[i, j - 1]
* arr[i, j - 2]
* arr[i, j - 3];
if (max < result)
max = result;
}
// check the maximum product
// in vertical row.
if ((i - 3) >= 0) {
result = arr[i, j] * arr[i - 1, j]
* arr[i - 2, j]
* arr[i - 3, j];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal going through down - right
if ((i - 3) >= 0 && (j - 3) >= 0) {
result = arr[i, j] * arr[i - 1, j - 1]
* arr[i - 2, j - 2]
* arr[i - 3, j - 3];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal going through up - right
if ((i - 3) >= 0 && (j - 3) <= 0) {
result = arr[i, j] * arr[i - 1, j + 1]
* arr[i - 2, j + 2]
* arr[i - 3, j + 3];
if (max < result)
max = result;
}
}
}
return max;
}
// Driver Code
static public void Main()
{
int [, ] arr = { { 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 1 },
{ 2, 3, 4, 5, 6 },
{ 7, 8, 9, 1, 0 },
{ 9, 6, 4, 2, 3 } };
Console.Write(FindMaxProduct(arr, n));
}
} // This code is contributed by Shrikant13 |
<?php // PHP program to find out the maximum product // in the matrix which four elements are // adjacent to each other in one direction $n = 5;
// function to find max product function FindMaxProduct( $arr , $n )
{ $max = 0; $result ;
// iterate the rows.
for ( $i = 0; $i < $n ; $i ++)
{
// iterate the columns.
for ( $j = 0; $j < $n ; $j ++)
{
// check the maximum product
// in horizontal row.
if (( $j - 3) >= 0)
{
$result = $arr [ $i ][ $j ] *
$arr [ $i ][ $j - 1] *
$arr [ $i ][ $j - 2] *
$arr [ $i ][ $j - 3];
if ( $max < $result )
$max = $result ;
}
// check the maximum product
// in vertical row.
if (( $i - 3) >= 0)
{
$result = $arr [ $i ][ $j ] *
$arr [ $i - 1][ $j ] *
$arr [ $i - 2][ $j ] *
$arr [ $i - 3][ $j ];
if ( $max < $result )
$max = $result ;
}
// check the maximum product in
// diagonal going through down - right
if (( $i - 3) >= 0 and ( $j - 3) >= 0)
{
$result = $arr [ $i ][ $j ] *
$arr [ $i - 1][ $j - 1] *
$arr [ $i - 2][ $j - 2] *
$arr [ $i - 3][ $j - 3];
if ( $max < $result )
$max = $result ;
}
// check the maximum product in
// diagonal going through up - right
if (( $i - 3) >= 0 and ( $j - 3) <= 0)
{
$result = $arr [ $i ][ $j ] *
$arr [ $i - 1][ $j + 1] *
$arr [ $i - 2][ $j + 2] *
$arr [ $i - 3][ $j + 3];
if ( $max < $result )
$max = $result ;
}
}
}
return $max ;
} // Driver Code
$arr = array ( array (1, 2, 3, 4, 5),
array (6, 7, 8, 9, 1),
array (2, 3, 4, 5, 6),
array (7, 8, 9, 1, 0),
array (9, 6, 4, 2, 3));
echo FindMaxProduct( $arr , $n );
// This code is contributed by anuj_67. ?> |
<script> // Javascript program to find out the // maximum product in the matrix // which four elements are adjacent // to each other in one direction let n = 5; // function to find max product
function FindMaxProduct(arr,n)
{
let max = 0, result;
// iterate the rows.
for (let i = 0; i < n; i++)
{
// iterate the columns.
for (let j = 0; j < n; j++)
{
// check the maximum product
// in horizontal row.
if ((j - 3) >= 0)
{
result = arr[i][j] * arr[i][j - 1]
* arr[i][j - 2]
* arr[i][j - 3];
if (max < result)
max = result;
}
// check the maximum product
// in vertical row.
if ((i - 3) >= 0)
{
result = arr[i][j] * arr[i - 1][j]
* arr[i - 2][j]
* arr[i - 3][j];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through down - right)
if ((i - 3) >= 0 && (j - 3) >= 0)
{
result = arr[i][j] * arr[i - 1][j - 1]
* arr[i - 2][j - 2]
* arr[i - 3][j - 3];
if (max < result)
max = result;
}
// check the maximum product in
// diagonal (going through up - right)
if ((i - 3) >= 0 && (j - 3) <= 0)
{
result = arr[i][j] * arr[i - 1][j + 1]
* arr[i - 2][j + 2]
* arr[i - 3][j + 3];
if (max < result)
max = result;
}
}
}
return max;
}
// Driver code
/* int arr[][4] = {{6, 2, 3, 4},
{5, 4, 3, 1},
{7, 4, 5, 6},
{8, 3, 1, 0}};*/
/* int arr[][5] = {{1, 2, 1, 3, 4},
{5, 6, 3, 9, 2},
{7, 8, 8, 1, 2},
{1, 0, 7, 9, 3},
{3, 0, 8, 4, 9}};*/
let arr = [[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 1 ],
[ 2, 3, 4, 5, 6 ],
[ 7, 8, 9, 1, 0 ],
[ 9, 6, 4, 2, 3 ]];
document.write(FindMaxProduct(arr, n));
// This code is contributed by sravan kumar </script> |
3024
Time Complexity: O(n2)
Auxiliary Space: O(1), as no extra space is used
For row-wise adjacent elements, we can generalize the method using a sliding window.
Note: All elements in the matrix must be non-zero.
Another Approach:
- For each row, create a window of size k. Find the product of k adjacent element as window product (wp).
- Iterate through the row from k to (row size), by sliding window approach, find the maximum product. Note: (row size)>=k.
- Assign the maximum product to a global maximum product.
Below is the implementation of the above approach:
// C++ implementation of the above approach #include <bits/stdc++.h> using namespace std;
int maxPro( int a[6][5], int n, int m, int k)
{ int maxi(1), mp(1);
for ( int i = 0; i < n; ++i)
{
// Window Product for each row.
int wp(1);
for ( int l = 0; l < k; ++l)
{
wp *= a[i][l];
}
// Maximum window product for each row
mp = wp;
for ( int j = k; j < m; ++j)
{
wp = wp * a[i][j] / a[i][j - k];
// Global maximum window product
maxi = max(maxi,max(mp,wp));
}
}
return maxi;
} // Driver Code int main()
{ int n = 6, m = 5, k = 4;
int a[6][5] = { { 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 1 },
{ 2, 3, 4, 5, 6 },
{ 7, 8, 9, 1, 0 },
{ 9, 6, 4, 2, 3 },
{ 1, 1, 2, 1, 1 } };
cout << maxPro(a, n, m, k);
return 0;
} |
// Java implementation of the above approach import java.io.*;
class GFG {
public static int maxPro( int [][] a,
int n, int m,
int k)
{
int maxi = 1 , mp = 1 ;
for ( int i = 0 ; i < n; ++i)
{
// Window Product for each row.
int wp = 1 ;
for ( int l = 0 ; l < k; ++l)
{
wp *= a[i][l];
}
// Maximum window product for each row
mp = wp;
for ( int j = k; j < m; ++j)
{
wp = wp * a[i][j] / a[i][j - k];
// Global maximum
// window product
maxi = Math.max(
maxi,
Math.max(mp, wp));
}
}
return maxi;
}
// Driver Code
public static void main(String[] args)
{
int n = 6 , m = 5 , k = 4 ;
int [][] a = new int [][] {
{ 1 , 2 , 3 , 4 , 5 }, { 6 , 7 , 8 , 9 , 1 },
{ 2 , 3 , 4 , 5 , 6 }, { 7 , 8 , 9 , 1 , 0 },
{ 9 , 6 , 4 , 2 , 3 }, { 1 , 1 , 2 , 1 , 1 }
};
// Function call
int maxpro = maxPro(a, n, m, k);
System.out.println(maxpro);
}
} |
# Python implementation of the above approach def maxPro(a,n,m,k):
maxi = 1
mp = 1 for i in range (n):
# Window Product for each row.
wp = 1
for l in range (k):
wp * = a[i][l]
# Maximum window product for each row
mp = wp
for j in range (k,m):
wp = wp * a[i][j] / a[i][j - k]
# Global maximum
# window product
maxi = max (
maxi,
max (mp, wp))
return maxi
# Driver Code n = 6
m = 5
k = 4
a = [[ 1 , 2 , 3 , 4 , 5 ], [ 6 , 7 , 8 , 9 , 1 ],
[ 2 , 3 , 4 , 5 , 6 ], [ 7 , 8 , 9 , 1 , 0 ],
[ 9 , 6 , 4 , 2 , 3 ], [ 1 , 1 , 2 , 1 , 1 ]]
# Function call maxpro = maxPro(a, n, m, k)
print (maxpro)
# This code is contributed by ab2127 |
// C# implementation of the above approach using System;
class GFG{
public static int maxPro( int [,] a, int n,
int m, int k)
{ int maxi = 1, mp = 1;
for ( int i = 0; i < n; ++i)
{
// Window Product for each row.
int wp = 1;
for ( int l = 0; l < k; ++l)
{
wp *= a[i, l];
}
// Maximum window product for each row
mp = wp;
for ( int j = k; j < m; ++j)
{
wp = wp * a[i, j] / a[i, j - k];
// Global maximum
// window product
maxi = Math.Max(maxi,
Math.Max(mp, wp));
}
}
return maxi;
} // Driver Code static public void Main()
{ int n = 6, m = 5, k = 4;
int [,] a = {{ 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 1 },
{ 2, 3, 4, 5, 6 }, { 7, 8, 9, 1, 0 },
{ 9, 6, 4, 2, 3 }, { 1, 1, 2, 1, 1 }};
// Function call
int maxpro = maxPro(a, n, m, k);
Console.WriteLine(maxpro);
} } // This code is contributed by avanitrachhadiya2155 |
<script> // Javascript implementation of the above approach function maxPro(a,n,m,k)
{
let maxi = 1, mp = 1;
for (let i = 0; i < n; ++i)
{
// Window Product for each row.
let wp = 1;
for (let l = 0; l < k; ++l)
{
wp *= a[i][l];
}
// Maximum window product for each row
mp = wp;
for (let j = k; j < m; ++j)
{
wp = wp * a[i][j] / a[i][j - k];
// Global maximum
// window product
maxi = Math.max(
maxi,
Math.max(mp, wp));
}
}
return maxi;
}
// Driver Code
let n = 6, m = 5, k = 4;
let a=[[1, 2, 3, 4, 5 ], [ 6, 7, 8, 9, 1 ],
[ 2, 3, 4, 5, 6 ], [ 7, 8, 9, 1, 0 ],
[ 9, 6, 4, 2, 3 ], [ 1, 1, 2, 1, 1 ]]
// Function call
let maxpro = maxPro(a, n, m, k);
document.write(maxpro);
// This code is contributed by rag2127
</script> |
3024
Time Complexity: O(n2)
Auxiliary Space: O(1), as no extra space is used