有效地乘以(n-1)个数组元素

时间:2012-08-26 11:52:00

标签: c++ c performance

  

可能重复:
  Interview Q: given an array of numbers, return array of products of all other numbers (no division)

我有两个数组inputArrayresultArray每个都有n个元素 任务是resultArray中的第n个元素应该inputArray中所有元素的乘法除了inputArray的第n个元素(全部为n-1个元素)。
例如。 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)
我们也不允许使用分部 我该如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

如果没有太多损坏,你应该尝试使用两个变量来存储乘法的结果:第i个元素左边和第i个元素右边的乘法的累积结果。

答案 1 :(得分:4)

您可以使用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数组。

答案 2 :(得分:1)

您是否知道乘以奇数是可逆的 - 仅使用乘法?看看Hacker's Delight,叫做“精确划分”。正如在那里所解释的,这个技巧也可以扩展到偶数。所以你可以通过几次乘法“除去”第n个数字 - 因为这是作业,我会让你知道如何。

答案 3 :(得分:0)

看到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

答案 4 :(得分:0)

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("%d\n",y[i]);

}