Answer

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));

Report Page