从未排序的数组中查找给定数量的元素,其总和等于给定的数字。
我已经写了下面的代码,它几乎可以工作。但复杂性是O(n ^ 2)。有更好的解决方案吗?
(function test(sum = 14, n = 4, nums = [7, 6, 1, 3, 2, 5, 4]) {
for (var i = 0; i < nums.length; i++) {
var rest = sum
var ret = []
var j = i;
do {
if (rest - nums[j] >= 0) {
rest = rest - nums[j]
} else {
j++
continue
}
ret.push(nums[j])
if (rest == 0 && ret.length == n) {
console.log("done", ret)
}
j++
} while (j < nums.length)
}
})()
答案 0 :(得分:2)
您需要一个哈希表来维护您访问过的数字列表或给定数组中所有数字的列表。所以在每次迭代中,你都会找到补码(给定sum - nums [i])。由于您要查找的是一对以上的值,因此您需要在散列表中找到加起来这些补码的键。这里要说的是,hashmap的查找时间为O(1) - 假设没有/很少有冲突 - 而迭代剩余的剩余数组将导致O(n ^ 2)