找到一个元素,将数组分成两个乘积相等的子数组
给定一个大小为 N 的数组。找到一个将数组分成两个乘积相等的子数组的元素。如果没有这样的分区是不可能的,则打印 -1。
例子 :
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}
一个简单的解决方案是从第二个元素开始考虑每个元素。计算左侧元素的乘积和右侧元素的乘积。如果这两个产品相同,则返回元素。
时间复杂度: O(N 2 )
更好的解决方案是使用前缀和后缀产品数组。从 0 遍历到第 n-1个索引,即它们产生相等结果的索引,是用相等乘积对数组进行分区的索引。
时间复杂度: O(N)
辅助空间: O(N)
C++
// C++ program to find an element which divides
// the array in two sub-arrays with equal product.
#include
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
// 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
# 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#
// 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
= 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
?>
Javascript
C++
// C++ program to find an element which divides
// the array in two sub-arrays with equal product.
#include
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;
}
Java
// 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
Python3
# 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#
// 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
Javascript
输出:
1
一个有效的解决方案是计算整个数组的乘积,除了 right_mul 中的第一个元素,将其视为分区元素。现在,我们从左到右遍历数组,将一个元素从 right_mul 中除,并将一个元素与 left_mul 相乘。 right_mul 等于 left_mul 的点,我们得到了分区。
时间复杂度: O(N)
辅助空间: O(1)
C++
// C++ program to find an element which divides
// the array in two sub-arrays with equal product.
#include
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;
}
Java
// 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
Python3
# 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#
// 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
Javascript
输出 :
1