热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个产品数组拼图|集合2(O(1)空间)

一个产品数组拼图|集合 2 (O(1)空间)原文:https://www . geesforgeks . org/product

一个产品数组拼图|集合 2 (O(1)空间)

原文:https://www . geesforgeks . org/product-array-拼图-set-2-o1-space/

给定 n 个整数的数组 arr[],构造一个乘积数组 prod,使得 prod[i]等于 arr[]除 arr[i]之外的所有元素的乘积。求解无除法运算符且在 O(n)中。
T3】例:

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}

在 A 产品数组拼图|第 1 集中已经讨论了 O(n)方法。前面的方法使用额外的 O(n)空间来构建产品数组。
解决方案 1: 使用原木属性。
方法:在这篇文章中,讨论了一种更好的方法,该方法使用 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 之和,

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]之外的所有元素的乘积,即反对数(和对数(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         sum += (long double)log10(a[i]);
    // output product for each index
    // antilog to find original product value
    for (int i = 0; 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             sum += Math.log10(a[i]);
        // output product for each index
        // anti log to find original product value
        for (int i = 0; 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 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             sum += Math.Log10(a[i]);
        // output product for each
        // index anti log to find
        // original product value
        for (int i = 0; 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

服务器端编程语言(Professional Hypertext Preprocessor 的缩写)

// PHP program for product array puzzle
// with O(n) time and O(1) space.
// epsilon value to maintain precision
$EPS=1e-9;
function productPuzzle($a, $n)
{
    global $EPS;
    // to hold sum of all values
    $sum = 0;
    for ($i = 0; $i <$n; $i++)
        $sum += (double)log10($a[$i]);
    // output product for each index
    // antilog to find original product value
    for ($i = 0; $i <$n; $i++)
        echo (int)($EPS + pow((double)10.00, $sum - log10($a[$i])))." ";
}
// Driver code
    $a = array(10, 3, 5, 6, 2 );
    $n = count($a);
    echo "The product array is: \n";
    productPuzzle($a, $n);
// This code is contributed by mits
?>

java 描述语言


Output: 

The product array is:
180 600 360 300 900

复杂度分析:


  • 时间复杂度: O(n)。
    只需要两次遍历数组。

  • 空间复杂度: O(1)。
    不需要额外空间。

这种方法是由 Abhishek Rajput 贡献的。
替代方法:这里有另一种方法通过使用 pow()函数来解决上述问题,不使用除法,在 O(n)时间内有效。
遍历数组,找到数组中所有元素的乘积。将产品存储在变量中。
然后再次遍历数组,使用公式(乘积*幂(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         prod *= arr[i];
    // we know x/y mathematically is same
    // as x*(y to power -1)
    for (int i = 0; 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             prod *= arr[i];
        // we know x/y mathematically is same
        // as x*(y to power -1)
        for (int i = 0; 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

Python 3

# 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                 prod *= arr[i];
            // we know x/y mathematically is same
            // as x*(y to power -1)
            for (int i = 0; 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

java 描述语言


Output: 

180 600 360 300 900

复杂度分析:


  • 时间复杂度: O(n)。
    只需要两次遍历数组。

  • 空间复杂度: O(1)。
    不需要额外空间。

注意:这种方法假设数组元素不是 0。
这个方法是由 斯特什罗伊 给出的。
如果你喜欢 GeeksforGeeks 并想投稿,你也可以用write.geeksforgeeks.org写一篇文章或者把你的文章邮寄到 contribute@geeksforgeeks.org。看到你的文章出现在极客博客主页上,帮助其他极客。
如果发现有不正确的地方,或者想分享更多关于上述话题的信息,请写评论。


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
author-avatar
老邮迢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有