Answer
t.me/js_testОтвет:
function twoClosestSum(arr, k) {
let l = 0,
r = arr.length - 1,
closest = [arr[l], arr[r]];
while (l < r) {
const sum = arr[l] + arr[r];
if (Math.abs(k - (closest[0] + closest[1])) > Math.abs(k - sum)) {
closest = [arr[l], arr[r]];
}
if (sum < k) {
l++;
} else {
r--;
}
}
return closest;
}
Объяснение:
Продолжаем использовать метод двух указателей. Также заводим указатели r и l но вводим ещё одну переменную closest и кладём туда два элемента массива на которые указывают указатели. Далее в цикле вместо того чтобы делать проверку на точное совпадение мы проверяем - если новая сумма элементов (sum) ближе к искомому число k чем текущая пара (closest) то перезаписываем closest. Ну и в конце возвращаем то что мы нашли.
Код для проверки:
function twoClosestSum(arr, k) {
let l = 0,
r = arr.length - 1,
closest = [arr[l], arr[r]];
while (l < r) {
const sum = arr[l] + arr[r];
if (Math.abs(k - (closest[0] + closest[1])) > Math.abs(k - sum)) {
closest = [arr[l], arr[r]];
}
if (sum < k) {
l++;
} else {
r--;
}
}
return closest;
}
console.log(twoClosestSum([-1, 2, 5, 6], 10));
console.log(twoClosestSum([-3, -1, 0, 2, 6], -5));
console.log(twoClosestSum([2, 4, 5], 8));
console.log(twoClosestSum([-9, -5, -2, -1, 1, 4, 9, 11], 25));