求和的唯一排列:Javascript算法

时间:2016-01-28 05:57:09

标签: javascript arrays algorithm

我已经完成了一个低效但有效的算法来确定数组(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: ')

2 个答案:

答案 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