Алгоритм следующий: для каждого элемента массива вычислять сумму с каждым из предыдущих элементов до тех пор, пока сумма не будет равна указанной. Таким образом ответ будет получен ранее, чем за NxN, так как нужно получить только первую пару (зависит от того, как близко к началу расположены эти элементы)
function sum_pairs(arr, sum){
for(var i=1; i<arr.length;i++){
for(var n=0;n<i;n++){
if(arr[n]+arr[i]===sum) return [arr[n], arr[i]];
}
}
}
Тест быстродействия:
var a = [...new Array(10000).fill(0).map(_ => Math.round(Math.random()*8)), 14, 16];
var a1 = a.slice();
var a2 = a.slice();
console.time('1');
console.log(sum_pairs1(a1,30))
console.timeEnd('1');
console.time('2');
console.log(sum_pairs2(a2,30))
console.timeEnd('2');
В моем случае результаты следующие:
функция из вопроса отработала за 350 мс
функция из текущего ответа - 110 мс
К тому же, было специально добавлено два числа в конец массива и сумму равную 30, чтобы sum_pairs2 проделал максимально возможное количество итераций. И еще, sum_pairs1, она же функция из вопроса, мутируем массив, что нехорошо