给两个整数数组找到所有子数组,其总和等于给定的目标数。例如。 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;
}
答案 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:如果您的array1
和array2
是排序数组,则可能是O(m + n)。
注意2:不确定默认sort
方法的实现方法,但我认为不会是O(N2)。请参阅here。
希望这很有用。