有效地将数组的 (n-1) 元素相乘

Efficiently multiply (n-1) elements of an array

本文关键字:元素 n-1 数组 有效地      更新时间:2023-10-16

可能的重复项:
面试 Q:给定一个数字数组,返回所有其他数字的乘积数组(无除法(

我有两个数组inputArrayresultArray每个数组都有n元素。
任务是resultArray中的第 n 个元素应该具有除inputArray的第 n 个元素(总共n-1个元素(之外的所有元素的乘法inputArray
例如。
inputArray={1,2,3,4}然后resultArray={24,12,8,6}
这很容易...

for(i = 0; i < n; i++)
  for(j = 0; j < n; j++)
    if(i != j) resultArray[i] *= inputArray[j];

但问题是复杂性不应该超过O(n(
我们也不允许使用除法。
我该如何解决这个问题?

在不剧透太多的情况下,您应该尝试使用两个变量来存储乘法的结果:乘法的累积结果位于第 i 个元素的左侧和第 i 个元素的右侧。

您可以使用 DP 方法,如下所示:

vector<int> products(const vector<int>& input) {
    int N = input.size();
    vector<int> partial(N+1); // partial[i] = input[0]...input[i-1]. partial[0] = 1
    partial[0] = 1;
    for (int i = 0; i < N; ++i) partial[i+1] = input[i]*partial[i];
    vector<int> ans(N);
    int current = 1;
    for (int i = N-1; i >= 0; --i) {
        // current is equal to input[i+1]...input[N-1]
        ans[i] = partial[i]*current;
        current *= input[i];
    }
    return ans;
}

这种方法的一个可能用法是当你处理你不能除以的东西时(例如,想想矩阵的相同问题(。

我使用 STL 向量做了这个解决方案,但当然代码可以很容易地"翻译"以使用 C 数组。

您是否知道乘以奇数是可逆的 - 仅使用乘法?参见黑客的喜悦,称为"精确划分"。正如那里所解释的,这个技巧也可以扩展到偶数。因此,您可以通过几次乘法"除以"第 n 个数字 - 由于这是家庭作业,我将留给您来了解如何操作。

main()
{
      int i,l,r,x[5]={1,2,3,4,5},y[5]; // x is the initial array, y is the final array
      int n = 5; // n be the size of the array, here already defined as 5
      l = 1; // l is the product of the values of the left side of an index in x
      r = 1; // r is the product of the values of the right side of an index in x
      for (i=0 ; i<5 ; i++) y[i]=1; // initialising all y values to 1
      for (i=0 ; i<5 ; i++)
      {
          y[i] = y[i]*l ;
          y[n-i-1] = y[n-i-1]*r;
          l = l*x[i];
          r = r*x[n-i-1];
      }
      for (i=0; i<5; i++) printf("%dn",y[i]);
}

看到Daniel Fleischman的回答,我决定我必须给出自己的实现,因为他有这么多行代码!

int i, buffer=1, result[n];
for(result[0]=1,i=1;i<n;i++) result[i] = result[i-1]*inputArray[i-1];
for(i=n-1,buffer=1;i>=0;buffer*=inputArray[i],i--) result[i]*=buffer;

三行代码(去除所有脂肪(。

http://ideone.com/EaQiu