Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
求和对的唯一排列:Javascript算法_Javascript_Arrays_Algorithm - Fatal编程技术网

求和对的唯一排列:Javascript算法

求和对的唯一排列: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

我已经完成了一个低效但有效的算法来计算数组中哪对数字的总和。我面对这两个问题:

(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;
  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;
  }
}