Given, an array of size N. Find an element which divides the array into two sub-arrays with equal product. Print -1 if no such partition is not possible.
Examples :
Input : 1 4 2 1 4 Output : 2 If 2 is the partition, subarrays are : {1, 4} and {1, 4} Input : 2, 3, 4, 1, 4, 6 Output : 1 If 1 is the partition, Subarrays are : {2, 3, 4} and {4, 6}
A simple solution will be to consider every element starting from the second element. Compute the product of elements on its left and product of elements on its right. If these two products are same, return the element.
Time Complexity: O(N2)
A better solution will be to use prefix and suffix product arrays. Traverse from 0 to n-1th index, the index at which they yield an equal result, is the index where the array is partitioned with an equal product.
Time Complexity: O(N)
Auxiliary Space: O(N)
Implementation:
// C++ program to find an element which divides // the array in two sub-arrays with equal product. #include <bits/stdc++.h> using namespace std;
// Function to find the index int findElement( int arr[], int n)
{ // Forming prefix sum array from 0
int prefixMul[n];
prefixMul[0] = arr[0];
for ( int i = 1; i < n; i++)
prefixMul[i] = prefixMul[i - 1] * arr[i];
// Forming suffix sum array from n-1
int suffixMul[n];
suffixMul[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixMul[i] = suffixMul[i + 1] * arr[i];
// Find the point where prefix and suffix
// sums are same.
for ( int i = 1; i < n - 1; i++)
if (prefixMul[i] == suffixMul[i])
return arr[i];
return -1;
} // Driver code int main()
{ int arr[] = { 2, 3, 4, 1, 4, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findElement(arr, n);
return 0;
} |
// Java program to find an element // which divides the array in two // sub-arrays with equal product. class GFG
{ // Function to find // the index static int findElement( int arr[],
int n)
{ // Forming prefix
// sum array from 0
int prefixMul[] = new int [n];
prefixMul[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
prefixMul[i] = prefixMul[i - 1 ] *
arr[i];
// Forming suffix sum
// array from n-1
int suffixMul[] = new int [n];
suffixMul[n - 1 ] = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
suffixMul[i] = suffixMul[i + 1 ] *
arr[i];
// Find the point where prefix
// and suffix sums are same.
for ( int i = 1 ; i < n - 1 ; i++)
if (prefixMul[i] == suffixMul[i])
return arr[i];
return - 1 ;
} // Driver code public static void main(String args[])
{ int arr[] = { 2 , 3 , 4 ,
1 , 4 , 6 };
int n = arr.length;
System.out.println(findElement(arr, n));
} } // This code is contributed // by Arnab Kundu |
# Python3 program to find an element # which divides the array in two # sub-arrays with equal product. # Function to find the index def findElement(arr, n):
# Forming prefix sum array from 0
prefixMul = []
prefixMul.append(arr[ 0 ])
for i in range ( 1 , n):
prefixMul.append(prefixMul[i - 1 ] * arr[i])
# Forming suffix sum array from n-1
suffixMul = [ None for i in range ( 0 , n)]
suffixMul[n - 1 ] = arr[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
suffixMul[i] = suffixMul[i + 1 ] * arr[i]
# Find the point where prefix and suffix
# sums are same.
for i in range ( 1 , n - 1 ):
if prefixMul[i] = = suffixMul[i]:
return arr[i]
return - 1
# Driver Code arr = [ 2 , 3 , 4 , 1 , 4 , 6 ]
n = len (arr)
print (findElement(arr, n))
# This code is contributed by SamyuktaSHegde |
// C# program to find an element // which divides the array in two // sub-arrays with equal product. using System;
class GFG
{ // Function to find
// the index
static int findElement( int []arr,
int n)
{
// Forming prefix
// sum array from 0
int []prefixMul = new int [n];
prefixMul[0] = arr[0];
for ( int i = 1; i < n; i++)
prefixMul[i] = prefixMul[i - 1] *
arr[i];
// Forming suffix sum
// array from n-1
int []suffixMul = new int [n];
suffixMul[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixMul[i] = suffixMul[i + 1] *
arr[i];
// Find the point where prefix
// and suffix sums are same.
for ( int i = 1; i < n - 1; i++)
if (prefixMul[i] == suffixMul[i])
return arr[i];
return -1;
} // Driver code public static void Main()
{ int []arr = {2, 3, 4, 1, 4, 6};
int n = arr.Length;
Console.Write(findElement(arr, n));
} } // This code is contributed // by shiv_bhakt |
<?php // PHP program to find an // element which divides // the array in two sub- // arrays with equal product. // Function to find the index function findElement( $arr , $n )
{ // Forming prefix
// sum array from 0
$prefixMul ;
$prefixMul [0] = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$prefixMul [ $i ] = $prefixMul [ $i - 1] *
$arr [ $i ];
// Forming suffix
// sum array from n-1
$suffixMul ;
$suffixMul [ $n - 1] = $arr [ $n - 1];
for ( $i = $n - 2; $i >= 0; $i --)
$suffixMul [ $i ] = $suffixMul [ $i + 1] *
$arr [ $i ];
// Find the point where
// prefix and suffix sums
// are same.
for ( $i = 1; $i < $n - 1; $i ++)
if ( $prefixMul [ $i ] == $suffixMul [ $i ])
return $arr [ $i ];
return -1;
} // Driver code $arr = array ( 2, 3, 4, 1, 4, 6 );
$n = sizeof( $arr ) / sizeof( $arr [0]);
echo findElement( $arr , $n );
// This code is contributed // by shiv_bhakt ?> |
<script> // javascript program to find an element which divides
// the array in two sub-arrays with equal product.
// Function to find the index
function findElement(arr,n)
{
// Forming prefix sum array from 0
let prefixMul= new Array(n);
prefixMul.fill(0);
prefixMul[0] = arr[0];
for (let i = 1; i < n; i++)
prefixMul[i] = prefixMul[i - 1] * arr[i];
// Forming suffix sum array from n-1
let suffixMul= new Array(n);
suffixMul.fill(0);
suffixMul[0] = arr[0];
suffixMul[n - 1] = arr[n - 1];
for (let i = n - 2; i >= 0; i--)
suffixMul[i] = suffixMul[i + 1] * arr[i];
// Find the point where prefix and suffix
// sums are same.
for (let i = 1; i < n - 1; i++)
if (prefixMul[i] == suffixMul[i])
return arr[i];
return -1;
}
let arr = [2, 3, 4, 1, 4, 6 ];
let n = arr.length;
document.write(findElement(arr, n));
// This code is contributed by vaibhavrabadiya117.
</script> |
// C program to find an element which divides // the array in two sub-arrays with equal product. #include <stdio.h> // Function to find the index int findElement( int arr[], int n)
{ // Forming prefix sum array from 0
int prefixMul[n];
prefixMul[0] = arr[0];
for ( int i = 1; i < n; i++)
prefixMul[i] = prefixMul[i - 1] * arr[i];
// Forming suffix sum array from n-1
int suffixMul[n];
suffixMul[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixMul[i] = suffixMul[i + 1] * arr[i];
// Find the point where prefix and suffix
// sums are same.
for ( int i = 1; i < n - 1; i++)
if (prefixMul[i] == suffixMul[i])
return arr[i];
return -1;
} // Driver code int main()
{ int arr[] = { 2, 3, 4, 1, 4, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
printf ( "%d" ,findElement(arr, n));
return 0;
} |
1
An efficient solution will be to calculate the product of the whole array except the first element in right_mul, considering it to be the partitioning element. Now, we traverse the array from left to right, dividing an element from right_mul and multiplying an element to left_mul. The point where right_mul equals left_mul, we get the partition.
Complexity Analysis:
- Time Complexity: O(N)
- Auxiliary Space: O(1)
Implementation:
// C++ program to find an element which divides // the array in two sub-arrays with equal product. #include <bits/stdc++.h> using namespace std;
// Function to compute partition int findElement( int arr[], int size)
{ int right_mul = 1, left_mul = 1;
// Computing right_sum
for ( int i = 1; i < size; i++)
right_mul *= arr[i];
// Checking the point of partition
// i.e. left_Sum == right_sum
for ( int i = 0, j = 1; j < size; i++, j++) {
right_mul /= arr[j];
left_mul *= arr[i];
if (left_mul == right_mul)
return arr[i + 1];
}
return -1;
} // Driver Code int main()
{ int arr[] = { 2, 3, 4, 1, 4, 6 };
int size = sizeof (arr) / sizeof (arr[0]);
cout << findElement(arr, size);
return 0;
} |
// C program to find an element which divides // the array in two sub-arrays with equal product. #include <stdio.h> // Function to compute partition int findElement( int arr[], int size)
{ int right_mul = 1, left_mul = 1;
// Computing right_sum
for ( int i = 1; i < size; i++)
right_mul *= arr[i];
// Checking the point of partition
// i.e. left_Sum == right_sum
for ( int i = 0, j = 1; j < size; i++, j++) {
right_mul /= arr[j];
left_mul *= arr[i];
if (left_mul == right_mul)
return arr[i + 1];
}
return -1;
} // Driver Code int main()
{ int arr[] = { 2, 3, 4, 1, 4, 6 };
int size = sizeof (arr) / sizeof (arr[0]);
printf ( "%d" ,findElement(arr, size));
return 0;
} // This code is contributed by kothavvsaakash |
// Java program to find an // element which divides the // array in two sub-arrays // with equal product. class GFG
{ // Function to // compute partition static int findElement( int arr[],
int size)
{ int right_mul = 1 ,
left_mul = 1 ;
// Computing right_sum
for ( int i = 1 ; i < size; i++)
right_mul *= arr[i];
// Checking the point of
// partition i.e. left_Sum
// == right_sum
for ( int i = 0 , j = 1 ;
j < size; i++, j++)
{
right_mul /= arr[j];
left_mul *= arr[i];
if (left_mul == right_mul)
return arr[i + 1 ];
}
return - 1 ;
} // Driver Code public static void main(String args[])
{ int arr[] = { 2 , 3 , 4 , 1 , 4 , 6 };
int size = arr.length;
System.out.println(findElement(arr,
size));
} } // This code is contributed // by Arnab Kundu |
# Python program to find an element which divides # the array in two sub-arrays with equal product. # Function to compute partition def findElement(arr, size):
right_mul = 1 ;
left_mul = 1 ;
# Computing right_sum
for i in range ( 1 ,size):
right_mul = right_mul * arr[i];
# Checking the point of partition
# i.e. left_Sum == right_sum
for i, j in zip ( range ( 0 ,size), range ( 1 , size, 1 )):
right_mul = right_mul / arr[j];
left_mul = left_mul * arr[i];
if (left_mul = = right_mul):
return arr[i + 1 ];
return - 1 ;
# Driver Code arr = [ 2 , 3 , 4 , 1 , 4 , 6 ,];
size = len (arr) ;
print (findElement(arr, size));
#This code is contributed by Shivi_Aggarwal |
// C# program to find an // element which divides the // array in two sub-arrays // with equal product. using System;
class GFG
{ // Function to // compute partition static int findElement( int []arr,
int size)
{ int right_mul = 1,
left_mul = 1;
// Computing right_sum
for ( int i = 1; i < size; i++)
right_mul *= arr[i];
// Checking the point of
// partition i.e. left_Sum
// == right_sum
for ( int i = 0, j = 1;
j < size; i++, j++)
{
right_mul /= arr[j];
left_mul *= arr[i];
if (left_mul == right_mul)
return arr[i + 1];
}
return -1;
} // Driver Code public static void Main()
{ int []arr = new int [] {2, 3, 4,
1, 4, 6};
int size = arr.Length;
Console.Write(findElement(arr, size));
} } // This code is contributed // by shiv_bhakt. |
<?php // PHP program to find an // element which divides // the array in two sub- // arrays with equal product. // Function to compute partition function findElement( $arr , $size )
{ $right_mul = 1;
$left_mul = 1;
// Computing right_sum
for ( $i = 1; $i < $size ; $i ++)
$right_mul *= $arr [ $i ];
// Checking the point
// of partition i.e.
// left_Sum == right_sum
for ( $i = 0, $j = 1;
$j < $size ; $i ++, $j ++)
{
$right_mul /= $arr [ $j ];
$left_mul *= $arr [ $i ];
if ( $left_mul == $right_mul )
return $arr [ $i + 1];
}
return -1;
} // Driver Code $arr = array (2, 3, 4, 1, 4, 6);
$size = sizeof( $arr ) /
sizeof( $arr [0]);
echo findElement( $arr , $size );
// This code is contributed // by shiv_bhakt. ?> |
<script> // javascript program to find an // element which divides the // array in two sub-arrays // with equal product. // Function to // compute partition
function findElement(arr , size) {
var right_mul = 1, left_mul = 1;
// Computing right_sum
for (i = 1; i < size; i++)
right_mul *= arr[i];
// Checking the point of
// partition i.e. left_Sum
// == right_sum
for (i = 0, j = 1; j < size; i++, j++) {
right_mul /= arr[j];
left_mul *= arr[i];
if (left_mul == right_mul)
return arr[i + 1];
}
return -1;
}
// Driver Code
var arr = [ 2, 3, 4, 1, 4, 6 ];
var size = arr.length;
document.write(findElement(arr, size));
// This code contributed by umadevi9616 </script> |
1
Time Complexity: O(N)
Auxiliary Space: O(1)