我已经完成了一个低效但有效的算法来确定数组(arr1)
中的哪一对数加起来。我正面临着这两个问题:
(1)它给了我“每一对”(例如1 + 11以及总和为12时的11 + 1),
和
(2)我不希望它为自己添加一个数字(例如findArrSum([1, 3, 4, 8, 9, 11, 6, ], 12)
我不希望它返回(6 + 6))。我可以通过我的if语句使这个忽略6,但在这种情况下它也会忽略解决方案(在这个例子中{6} 6 findArrSum([1, 3, 4, 8, 9, 11, 6, 6], 12)
。
function findArrSum(arr1, sum) {
var i = 0;
for (i in arr1) {
arr1.map(function(num) {
var answerSum = (num + arr1[i]);
if (answerSum == sum && num != arr1[i]) {
console.log(num +"+" +arr1[i] +"=" +sum);
}
});
}
}
console.log('Enter an array and a sum that you want a pair to add to: ')
答案 0 :(得分:2)
通过进行
之类的小改动,您的问题都可以解决function findArrSum(arr1, sum) {
var i = 0;
var usedSumArray = []; //new array introduced to store already done sums
for (i in arr1) {
arr1.map(function(num) {
var thisSum = num +"+" +arr1[i]; //storing sum string
if ( num != arr1[i] && usedSumArray.indexOf( thisSum ) == -1 ) //checking if the number is same or sum already done
{
usedSumArray.push( thisSum );
var answerSum = (num + arr1[i]);
if (answerSum == sum && num != arr1[i])
{
console.log(num +"+" +arr1[i] +"=" +sum);
}
}
});
}
}
答案 1 :(得分:2)
一个朴素的算法
function findArrSum(arr, sum) {
for(var i=0; i<arr.length; ++i)
for(var j=i+1; j<arr.length; ++j)
if(arr[i] + arr[j] === sum)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
}
但费用为n^2
。我们可以通过先排序,然后使用二分法搜索来做得更好
function dicSearch(arr, item, from, to) {
if(from === to) return -1;
var mid = Math.floor((from + to) / 2);
if(arr[mid] > item) return dicSearch(arr, item, from, mid);
if(arr[mid] < item) return dicSearch(arr, item, mid+1, to);
return mid;
}
function findArrSum(arr, sum) {
arr.sort(function(a,b) {
return a-b;
});
for(var i=0; i<arr.length; ++i) {
var j = dicSearch(arr, sum-arr[i], i+1, arr.length);
if(j >= 0)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
}
}
这应该只花费n log n
。您甚至可以在达到最低j
时停止迭代,而不是达到arr.length
,从而加快速度。
但是我们可以通过使用哈希来更快地完成它。
function findArrSum(arr, sum) {
var hash = Object.create(null); // Also consider ES6 map
for(var i=0; i<arr.length; ++i) {
var j = hash[arr[i]];
if(j != null)
console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
hash[sum-arr[i]] = i;
}
}
平均只需花费n
。