📌  相关文章
📜  找到一个元素,将数组分成两个乘积相等的子数组

📅  最后修改于: 2022-05-13 01:57:48.071000             🧑  作者: Mango

找到一个元素,将数组分成两个乘积相等的子数组

给定一个大小为 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