获取O(n)中两个数组之间的所有可能的乘法值?

时间:2015-10-24 22:42:42

标签: javascript arrays performance nested multiplication

在从(n> 0)开始的数字序列中,我需要找到两个相互相乘的数字,返回与序列之和相同的值减去这些数字的总和(sum - (x + y) ))。我已经编写了一个程序,但我认为它不够高效。有没有办法在没有嵌套循环的情况下获得相同的结果? 这是我的代码:

function removeNb (n) {

result = [];
var sum = (n*(n+1))/2

for(var x=n; x > 0; x--){
  for(var y = 1; y<=x; y++){

  z= x*y;
  var r = sum-(y+x);

  if(z == r){
  result.push([y,x],[x,y])} *//because with inverted loops (y++, x--) only unique values are left.*
  }
 return result;
} 

1 个答案:

答案 0 :(得分:1)

到目前为止,您的解决方案有O(n ^ 2)。据我所知,序列不是随机序列。它是序列1,2,3 ... N.我假设从以下行sum =(n *(n + 1))/ 2。

现在让我们看一下方程r = z,它实际上是x * y = sum-x-y。你可以做一个循环迭代x从1到n并计算y。 Y =(sum-x)/(x + 1)。如果y等于或小于N,那么你有一个解(x,y)。使用这种方法,您将创建一个循环,复杂性将为O(n)。

您也可以预先计算值并将tham存储为数组。如果n在一个小范围内,这个解决方案很有用。