在从(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;
}
答案 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在一个小范围内,这个解决方案很有用。