Arrays 将数组元素替换为整个数组中所有其他元素的倍数,并使用O(n)

Arrays 将数组元素替换为整个数组中所有其他元素的倍数,并使用O(n),arrays,algorithm,data-structures,stack,Arrays,Algorithm,Data Structures,Stack,我有一个数组arr=[3,4,2,5,6,8,2]。数组中的每个元素都必须替换为数组中所有其他元素的倍数。 e、 g索引=0,值3必须替换为4*2*5*6*8*2,索引=3,值5必须替换为3*4*2*6*8*2。 这必须在一个月内完成。 我有解队列和堆栈的解决方案,但我最终进行了n*n-1次迭代,结果是^2。有什么帮助吗?首先,计算此数组的总乘积。 然后,将数组中的每个元素除以该值,并将结果指定给其位置。 因此,总的乘积是在On中完成的,赋值也是在On中完成的 =>ALG:O2*n=On 形成两

我有一个数组arr=[3,4,2,5,6,8,2]。数组中的每个元素都必须替换为数组中所有其他元素的倍数。 e、 g索引=0,值3必须替换为4*2*5*6*8*2,索引=3,值5必须替换为3*4*2*6*8*2。 这必须在一个月内完成。
我有解队列和堆栈的解决方案,但我最终进行了n*n-1次迭代,结果是^2。有什么帮助吗?

首先,计算此数组的总乘积。 然后,将数组中的每个元素除以该值,并将结果指定给其位置。 因此,总的乘积是在On中完成的,赋值也是在On中完成的

=>ALG:O2*n=On

形成两个数组:左侧一个累积乘积,右侧一个累积乘积。它们都可以在O2*n中构建。 取元素左侧的累积积,再乘以右侧的累积积。这就开始了。 比如:

leftCumulative[1]=1;
for(j=2;j<=n;++j) leftCumulative[j]=leftCumulative[j-1]*arr[j];
rightCumulative[n]=1;
for(j=n-1;j>=1;--j) rightCumulative[j]=arr[j]*rightCumulative[j+1];

arr[1]=rightCumulative[2];
arr[n]=leftCumulative[n-1];
for(j=2;j<=n-1;++j) arr[j]=leftCumulative[j-1]*rightCumulative[j+1];
可以使用更少的额外内存,并使循环更干净,但这解决了上述问题。即使乘法是非交换的,它也能工作

使用java

  int[] arr = {3, 4, 2, 5, 6, 8, 2};

  int wholeProduct = arr[0];   //  wholeProduct = arr[0] * arr[1] * ... * arr[n-1]
  for(int i=1; i<arr.length; i++)
     wholeProduct *= arr[i];

  for(int i=0; i<arr.length; i++) 
     arr[i] = wholeProduct/arr[i];
与@Lecagy所描述的技术相同


请注意,当包含许多元素时,整个产品可能不包含结果,您需要将类型更改为long或BigInteger

如果数组包含一个零呢?这是一个很好的点。可以循环一次数组并确定是否存在非、一个或多个零:如果不存在,则上述解决方案有效。如果有多个条目,则所有条目均为零。如果只有一个零,只需将除零之外的所有条目相乘,然后在其中赋值。所有其他的都是零非零的,对零的发生有同样的怀疑。即使乘法是非交换的,它也能工作!我知道你的意思是,它甚至适用于其他不一定是可交换的运算,但如果照字面理解,这句话相当有趣。无论如何,这个解决方案很好,因为它不需要处理数组中有多少个零的特殊情况+1我想你是指第2行中的++j和第4行中的-j?