我正在研究一个javascript函数,它接受一个整数数组和一个目标作为参数。任务是找到数组中第一对整数,其总和等于目标。我尝试了几种不同的方法,但是对于较大的输入数组,我一直都会遇到超时错误。有人可以给我一些关于如何更好地优化此代码的指示吗?谢谢!
var sum_pairs = function(ints, s){
var r = [];
var a = true;
var l = ints.length;
for(var j = 0; j < l; j++){
if(a){
for(var i = 0; i < j; i++){
if(ints[j] + ints[i] == s){
r[0] = ints[i];
r[1] = ints[j];
a = false;
break;
}
}
}
else{
console.log('breaking');
break;
}
}
return r[0] == null ? null : r;
}
答案 0 :(得分:3)
你可以使用一些超速机制,比如
a
的array[i]
Long list需要 153 ms 。
var sum_pairs = function (array, s) {
var a, i,
hash = Object.create(null);
for (i = 0; i < array.length; i++) {
a = array[i];
if (hash[s - a]) {
return [s - a, a];
}
if (!hash[a]) {
hash[a] = true;
}
}
};
console.log(sum_pairs([11, 3, 7, 5], 10)); // [3, 7]
console.log(sum_pairs([4, 3, 2, 3, 4], 6)); // [4, 2]
console.log(sum_pairs([0, 0, -2, 3], 2)); // undefined
console.log(sum_pairs([10, 5, 2, 3, 7, 5], 10)); // [3, 7]
console.log(sum_pairs([1, 2, 3, 4, 1, 0], 2)); // [1, 1]
console.log(sum_pairs([1, -2, 3, 0, -6, 1], -6)); // [0, -6]
console.log(sum_pairs([0, 2, 0], 0)); // [0, 0]
console.log(sum_pairs([5, 9, 13, -3], 10)); // [13, -3]
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
对于我们在迭代数组时遇到的每个数字,我们将该数字的预期合作伙伴target - number
添加到Set
中。一旦我们遇到已经在我们的集合中的数字,我们就知道它的合作伙伴已经遇到并返回该对作为解决方案:
// Return the first two values of 'numbers' summing up to 'target':
function sum_pairs(numbers, target) {
let paired = new Set();
for (let number of numbers) {
if (paired.has(number)) return [target - number, number];
paired.add(target - number);
}
}
// Examples:
console.log(...sum_pairs([9, 3, 7, 5, 1], 10)); // [3, 7]
console.log(...sum_pairs([4, 3, 2, 3, 4], 6)); // [4, 2]
console.log(...sum_pairs([9, 3, 6, 4, 1], 10)); // [6, 4]
&#13;
此实现具有线性运行时复杂性,因此对于长输入数组更快,但它会带来额外的内存成本。
如果您想要原始速度,请使用传统的for循环替换for-for循环,并使用let
声明替换var
变量。