📜  产品阵列拼图|集合2(O(1)空间)

📅  最后修改于: 2021-05-06 19:50:24             🧑  作者: Mango

给定n个整数的数组arr [],请构造乘积数组prod [](大小相同),以使prod [i]等于arr []的所有元素(除arr [i]之外)的乘积。在没有除法运算符并在O(n)中求解。
例子:

Input: arr[] = {10, 3, 5, 6, 2}
Output: prod[] = {180, 600, 360, 300, 900}
The elements of output array are 
{3*5*6*2, 10*5*6*2, 10*3*6*2, 
10*3*5*2, 10*3*5*6}

Input: arr[] = {1, 2, 1, 3, 4}
Output: prod[] = {24, 12, 24, 8, 6}
The elements of output array are 
{3*4*1*2, 1*1*3*4, 4*3*2*1, 
1*1*4*2, 1*1*3*2}

产品阵列难题|中已经有一种讨论过的O(n)方法。集1.先前的方法使用额外的O(n)空间来构造乘积数组。
解决方案1:使用日志属性。
方法:在本文中,讨论了一种更好的方法,该方法使用log属性查找数组中所有元素(除特定索引之外)的乘积。这种方法不占用额外的空间。
使用log的属性将大数相乘

x = a * b * c * d
log(x) = log(a * b * c * d)
log(x) = log(a) + log(b) + log(c) + log(d)
x = antilog(log(a) + log(b) + log(c) + log(d))

所以这个想法很简单,
遍历数组并找到所有元素的对数和,

log(a[0]) + log(a[1]) + 
.. + log(a[n-1])

然后再次遍历数组,并使用该公式查找乘积。

antilog((log(a[0]) + log(a[1]) +
 .. + log(a[n-1])) - log(a[i]))

这等于除a [i]以外的所有元素的乘积,即antilog(sum-log(a [i]))。

C++
// C++ program for product array puzzle
// with O(n) time and O(1) space.
#include 
using namespace std;
  
// epsilon value to maintain precision
#define EPS 1e-9
  
void productPuzzle(int a[], int n)
{
    // to hold sum of all values
    long double sum = 0;
    for (int i = 0; i < n; i++)
        sum += (long double)log10(a[i]);
  
    // output product for each index
    // antilog to find original product value
    for (int i = 0; i < n; i++)
        cout << (int)(EPS + pow((long double)10.00,
                                sum - log10(a[i])))
             << " ";
}
  
// Driver code
int main()
{
    int a[] = { 10, 3, 5, 6, 2 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << "The product array is: \n";
    productPuzzle(a, n);
    return 0;
}


Java
// Java program for product array puzzle
// with O(n) time and O(1) space.
public class Array_puzzle_2 {
  
    // epsilon value to maintain precision
    static final double EPS = 1e-9;
  
    static void productPuzzle(int a[], int n)
    {
        // to hold sum of all values
        double sum = 0;
        for (int i = 0; i < n; i++)
            sum += Math.log10(a[i]);
  
        // output product for each index
        // anti log to find original product value
        for (int i = 0; i < n; i++)
            System.out.print(
                (int)(EPS
                      + Math.pow(
                            10.00, sum
                                       - Math.log10(a[i])))
                + " ");
    }
  
    // Driver code
    public static void main(String args[])
    {
        int a[] = { 10, 3, 5, 6, 2 };
        int n = a.length;
        System.out.println("The product array is: ");
        productPuzzle(a, n);
    }
}
// This code is contributed by Sumit Ghosh


Python
# Python program for product array puzzle
# with O(n) time and O(1) space.
  
import math
  
# epsilon value to maintain precision
EPS = 1e-9
  
def productPuzzle(a, n):
     
    # to hold sum of all values
    sum = 0
    for i in range(n):
        sum += math.log10(a[i])
      
    # output product for each index
    # antilog to find original product value
    for i in range(n):
        print int((EPS + pow(10.00, sum - math.log10(a[i])))),
      
    return
   
# Driver code
a = [10, 3, 5, 6, 2 ]
n = len(a)
print "The product array is: "
productPuzzle(a, n)
  
# This code is contributed by Sachin Bisht


C#
// C# program for product
// array puzzle with O(n)
// time and O(1) space.
using System;
class GFG {
  
    // epsilon value to
    // maintain precision
    static double EPS = 1e-9;
  
    static void productPuzzle(int[] a,
                              int n)
    {
        // to hold sum of all values
        double sum = 0;
        for (int i = 0; i < n; i++)
            sum += Math.Log10(a[i]);
  
        // output product for each
        // index anti log to find
        // original product value
        for (int i = 0; i < n; i++)
            Console.Write((int)(EPS + Math.Pow(10.00, sum - Math.Log10(a[i]))) + " ");
    }
  
    // Driver code
    public static void Main()
    {
        int[] a = { 10, 3, 5, 6, 2 };
        int n = a.Length;
        Console.WriteLine("The product array is: ");
        productPuzzle(a, n);
    }
}
  
// This code is contributed by mits


PHP


C++
// C++ program for product array puzzle
// with O(n) time and O(1) space.
#include 
using namespace std;
  
// Solve function which prints the answer
void solve(int arr[], int n)
{
  
    // Initialize a variable to store the
    // total product of the array elements
    int prod = 1;
    for (int i = 0; i < n; i++)
        prod *= arr[i];
  
    // we know x/y mathematically is same
    // as x*(y to power -1)
    for (int i = 0; i < n; i++) {
        cout << (int)(prod * pow(arr[i], -1)) << ' ';
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 10, 3, 5, 6, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    solve(arr, n);
    return 0;
}
  
// This code is contributed by Sitesh Roy


Java
// Java program for product array puzzle
// with O(n) time and O(1) space.
public class ArrayPuzzle {
  
    static void solve(int arr[], int n)
    {
        // Initialize a variable to store the
        // total product of the array elements
        int prod = 1;
        for (int i = 0; i < n; i++)
            prod *= arr[i];
  
        // we know x/y mathematically is same
        // as x*(y to power -1)
        for (int i = 0; i < n; i++)
            System.out.print(
                (int)prod * Math.pow(arr[i], -1) + " ");
    }
  
    // Driver code
    public static void main(String args[])
    {
        int arr[] = { 10, 3, 5, 6, 2 };
        int n = arr.length;
        solve(arr, n);
    }
}
// This code is contributed by Sitesh Roy


Python3
# Python program for product array puzzle
# with O(n) time and O(1) space.
def solve(arr, n):
  
    # Initialize a variable to store the 
    # total product of the array elements
    prod = 1
    for i in arr:
        prod *= i
  
    # we know x / y mathematically is same 
    # as x*(y to power -1)
    for i in arr:
        print(int(prod*(i**-1)), end =" ")
  
# Driver Code
arr = [10, 3, 5, 6, 2]
n = len(arr)
solve(arr, n)
  
  
# This code is contributed by Sitesh Roy


C#
// C# program for product array puzzle
// with O(n) time and O(1) space.
using System;
  
class GFG {
  
public
    class ArrayPuzzle {
  
        static void solve(int[] arr, int n)
        {
            // Initialize a variable to store the
            // total product of the array elements
            int prod = 1;
            for (int i = 0; i < n; i++)
                prod *= arr[i];
  
            // we know x/y mathematically is same
            // as x*(y to power -1)
            for (int i = 0; i < n; i++)
                Console.Write(
                    (int)prod * Math.Pow(arr[i], -1) + " ");
        }
  
        // Driver code
        static public void Main()
        {
            int[] arr = { 10, 3, 5, 6, 2 };
            int n = arr.Length;
            solve(arr, n);
        }
    }
}
// This code is contributed by shivanisinghss2110


输出:
The product array is: 
180 600 360 300 900

复杂度分析:

  • 时间复杂度: O(n)。
    仅需要两次遍历数组。
  • 空间复杂度: O(1)。
    不需要额外的空间。

该方法由Abhishek Rajput提供。
替代方法:这是通过使用pow()函数解决上述问题的另一种方法,该方法不使用除法并且可以在O(n)时间内工作。
遍历数组并找到数组中所有元素的乘积。将产品存储在变量中。
然后再次遍历数组,并使用公式(product * pow(a [i],-1))查找除该数字以外的所有元素的乘积

C++

// C++ program for product array puzzle
// with O(n) time and O(1) space.
#include 
using namespace std;
  
// Solve function which prints the answer
void solve(int arr[], int n)
{
  
    // Initialize a variable to store the
    // total product of the array elements
    int prod = 1;
    for (int i = 0; i < n; i++)
        prod *= arr[i];
  
    // we know x/y mathematically is same
    // as x*(y to power -1)
    for (int i = 0; i < n; i++) {
        cout << (int)(prod * pow(arr[i], -1)) << ' ';
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 10, 3, 5, 6, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    solve(arr, n);
    return 0;
}
  
// This code is contributed by Sitesh Roy

Java

// Java program for product array puzzle
// with O(n) time and O(1) space.
public class ArrayPuzzle {
  
    static void solve(int arr[], int n)
    {
        // Initialize a variable to store the
        // total product of the array elements
        int prod = 1;
        for (int i = 0; i < n; i++)
            prod *= arr[i];
  
        // we know x/y mathematically is same
        // as x*(y to power -1)
        for (int i = 0; i < n; i++)
            System.out.print(
                (int)prod * Math.pow(arr[i], -1) + " ");
    }
  
    // Driver code
    public static void main(String args[])
    {
        int arr[] = { 10, 3, 5, 6, 2 };
        int n = arr.length;
        solve(arr, n);
    }
}
// This code is contributed by Sitesh Roy

Python3

# Python program for product array puzzle
# with O(n) time and O(1) space.
def solve(arr, n):
  
    # Initialize a variable to store the 
    # total product of the array elements
    prod = 1
    for i in arr:
        prod *= i
  
    # we know x / y mathematically is same 
    # as x*(y to power -1)
    for i in arr:
        print(int(prod*(i**-1)), end =" ")
  
# Driver Code
arr = [10, 3, 5, 6, 2]
n = len(arr)
solve(arr, n)
  
  
# This code is contributed by Sitesh Roy

C#

// C# program for product array puzzle
// with O(n) time and O(1) space.
using System;
  
class GFG {
  
public
    class ArrayPuzzle {
  
        static void solve(int[] arr, int n)
        {
            // Initialize a variable to store the
            // total product of the array elements
            int prod = 1;
            for (int i = 0; i < n; i++)
                prod *= arr[i];
  
            // we know x/y mathematically is same
            // as x*(y to power -1)
            for (int i = 0; i < n; i++)
                Console.Write(
                    (int)prod * Math.Pow(arr[i], -1) + " ");
        }
  
        // Driver code
        static public void Main()
        {
            int[] arr = { 10, 3, 5, 6, 2 };
            int n = arr.Length;
            solve(arr, n);
        }
    }
}
// This code is contributed by shivanisinghss2110
输出:
180 600 360 300 900

复杂度分析:

  • 时间复杂度: O(n)。
    仅需要两次遍历数组。
  • 空间复杂度: O(1)。
    不需要额外的空间。