Добрый день! Решаю задачи на JS на одном сайте и попалась мне такая задачка:
Дается массив целых чисел (первый параметр) и сумма (второй параметр).
Пример:
sum_pairs([11, 3, 7, 5], 10);
Необходимо найти в массиве два числа сумма которых равна 10 в данном случае(второму параметру).
Если таких пар несколько, то возвращается та пара у которой индекс второго числа меньше, например:
Слева на право.
sum_pairs([10, 5, 2, 3, 7, 5], 10)
# ^-----------^ 5 + 5 = 10, индексы: 1, 5
# ^--^ 3 + 7 = 10, индексы: 3, 4 *
# * пара находится раньше в массиве, и поэтому это правильный ответ
=> [3, 7]
У меня получилось следующее:
var sum_pairs=function(ints, s){
var arr = [];
ints.forEach(function(curr, ind) {
for (var i = 0; i < ints.length; i++) {
if (i <= ind) continue;
if (curr + ints[i] == s) {
arr.push([curr, ints[i], i]);
ints.splice(i);
}
}
});
arr.sort((a, b) => a[2] - b[2]);
return arr.length == 0 ? undefined : arr[0].slice(0, 2);
}
Так же в массиве могут быть одинаковые числа и отрицательные числа, если такой суммы в массиве не найдено, то возвращается undefined, а если найдена то возвращается эта пара чисел, например [3, 7];
Все работает, но проблема в том, что в задании будут массивы длиной до 10,000,000, и в моем случае если сумма(второй параметр) будет например 19999997 и все числа в массиве будут уникальными, то придется перебрать весь массив, что не эффективно и очень долго.
Я не прошу решать задачу за меня, просто подскажите в каком направлении копать.