求和对的唯一排列:Javascript算法
我已经完成了一个低效但有效的算法来计算数组中哪对数字的总和。我面对这两个问题: (1) 它给了我“每”对(例如,1+11以及当总和为12时的11+1) 及 (2) 我不希望它向自身添加数字(例如,求和对的唯一排列:Javascript算法,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我已经完成了一个低效但有效的算法来计算数组中哪对数字的总和。我面对这两个问题: (1) 它给了我“每”对(例如,1+11以及当总和为12时的11+1) 及 (2) 我不希望它向自身添加数字(例如,findArrSum([1,3,4,8,9,11,6,12])我不希望它返回(6+6))。我可以通过if语句使其忽略6,但在这种情况下,它也会忽略解决方案(在本例中为6+6findArrSum([1,3,4,8,9,11,6,6,12]) 这两个问题都可以通过做一些小的改变来解决,比如 function
findArrSum([1,3,4,8,9,11,6,12])
我不希望它返回(6+6))。我可以通过if语句使其忽略6,但在这种情况下,它也会忽略解决方案(在本例中为6+6findArrSum([1,3,4,8,9,11,6,6,12])
这两个问题都可以通过做一些小的改变来解决,比如
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);
}
}
});
}
}
一个简单的算法将是
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 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;
}
}
函数findarsum(arr,sum){
var hash = Objist.Cube(null);/也考虑ES6映射
对于(vari=0;iA simple fiddle将有助于arr1.map(function(num,b){
,然后num!=arr1[i]
变成(num!=arr1[i]&&i!=b)
进行编辑?我很困惑..因此我将其切换为(i=0;ifunction 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);
}
}
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;
}
}