如何让它在O(n)中运行?

时间:2010-05-26 07:50:31

标签: algorithm complexity-theory

  

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

我遇到了一个真正让我思考的面试任务/问题......所以这就是:

你有一个数字A [N]的N个数字。你必须组成一个数组Output [N],使得Output [i]将等于除A [i]之外的所有A [N]元素的乘法。例如,Output [0]将A [1]乘以A [N-1],Output [1]将乘以A [0]和A [2]乘以A [N-1]。在没有除法运算符的情况下解决它并在O(n)中解决。

我真的试图提出一个解决方案,但我总是以O(n ^ 2)的复杂性结束。也许比我聪明的人能告诉我一个在O(n)中工作的算法,或者至少给我一个提示......

3 个答案:

答案 0 :(得分:15)

构造两个临时数组--B [N]和C [N]。将B [N]的每个元素形成为其左侧(包括其自身)的A [N]个元素的乘积 - 从左到右,N个运算。形成C [N]的每个元素作为A [N]元素的右边(包括它自身)的产物 - 从右到左,N个操作。

然后A [n] = B [n-1] * C [n + 1] - 另外N个操作来解决这个问题。最终只有3N的操作,即O(N)。它只是短暂的,因为B [0]和C [N-1],以及第一个和最后一个A,不需要乘法。此外,C [0] = B [N-1],所以我认为你应该完全需要3N-5次操作。

答案 1 :(得分:0)

您生成两个中间数组L,其中L[i] = products of A[0]..A[i-1]U U[i] = products of A[i+1]..A[N-1]。这些都可以在O(n)中生成。您的输出值B[i]将只是L[i] * U[i] - 这也是O(n)。

答案 2 :(得分:0)

作弊我知道但是: -

for (x = 0 ; x < n ; x++) {
   bigtot = bigtot * in[x];
}
for (x = 0 ; x < n ; x++) {
      out[n] = bigot;
      for ( y = in[x]; y > 0 ; y--) {
         out[n] = out[n] - in[x]
      } 
}