https://leetcode.com/problems/check-if-n-and-its-double-exist/description/ Easy

Условие

Дан массив целых чисел arr. Верни true, если существует пара индексов i и j, таких что:

i != j

arr[i] == 2 * arr[j] или arr[j] == 2 * arr[i]. Иначе верни false.

Примеры

Input: arr = [10, 2, 5, 3] Output: true Explanation: 10 == 2 * 5

Input: arr = [3, 1, 7, 11] Output: false Explanation: Нет таких пар

Решение

fun checkIfExist(arr: IntArray): Boolean {
    // Создаём множество для хранения уже просмотренных чисел
    val seen = mutableSetOf<Int>()

    for (num in arr) {
        // Проверяем наличие удвоенного значения или половины (если чётное)
        if ((2 * num) in seen || (num % 2 == 0 && num / 2 in seen)) {
            return true
        }
        // Добавляем текущее число в множество
        seen.add(num)
    }

    return false
}

Временная сложность

O(n), где n — длина массива, за один проход с операциями в множестве.

Пространственная сложность

O(n), для хранения элементов в множестве.