给两个整数数组找到所有子数组,其总和等于给定的目标数

时间:2016-07-07 22:50:04

标签: javascript arrays

给两个整数数组找到所有子数组,其总和等于给定的目标数。例如。 array1 = [1,2,3,4] array2 = [7,3,4] sumToFind = 5 findSubArrays(array1,array2,num) 输出:[[1,4],[2,3]]

我通过以下方式接近它,但由于它具有O(N2)的复杂性,因此可以改进以实现O(N)。

function findSubArray(array1, array2, sumToFind){
  var len1 = array1.length;
  var len2 = array2.length;
  var result=[];
  for(var i=0;i<len1;i++){
     for(var j=0;j<len2;j++){
        if(array1[i] + array2[j] === sumToFind){
            result.push([array1[i], array2[j]]);
        }
    }
  }
  return result;
}

1 个答案:

答案 0 :(得分:0)

我不确定这可以实现O(N),但是我得到的解决方案具有O(nlgn)的复杂度(这是排序算法的时间复杂度)。

var findSubArray2 = function(arr1, arr2, sumToFind) {
  var result = [];
  var sortedArr1 = arr1.sort(); // O(nlgn)
  var sortedArr2 = arr2.sort(); // O(mlgm)

  // Use two pointers to check element in each array.
  // O(n + m)
  for (var i = 0, j = arr2.length - 1; i < arr1.length && j >= 0;) {
    var temp = sortedArr1[i] + sortedArr2[j];
    if (temp > sumToFind) {
      j--;
    } else if (temp < sumToFind) {
      i++;
    } else {
      result.push([sortedArr1[i], sortedArr2[j]]);
      i++;
    }
  }

  return result;
}

注意1:如果您的array1array2是排序数组,则可能是O(m + n)。

注意2:不确定默认sort方法的实现方法,但我认为不会是O(N2)。请参阅here

希望这很有用。