Задача 1. Пара с заданной суммой
Дан массив из n целых чисел и число S. Нужно определить, есть ли в массиве два разных элемента, сумма которых равна S. Ограничение: n до 105.
Решение
Наивное решение — перебрать все пары — работает за O(n²). При n до 105 это около 1010 операций и по времени не проходит.
Идея: пройти массив один раз, храня уже встреченные числа в хеш-множестве. Для текущего элемента x проверяем, встречалось ли ранее число S − x.
Если S − x уже в множестве — пара найдена. Иначе добавляем x в множество и идём дальше.
Проверка в хеш-множестве и добавление — в среднем за O(1), поэтому весь алгоритм работает за O(n).
Краевые случаи: элементы должны быть разными по позиции — но так как мы проверяем S − x до добавления x, один и тот же элемент дважды не учитывается.
Ответ: Задача решается за один проход, O(n) по времени и O(n) по памяти.
«Искали пару перебором за O(n²)» почти всегда заменяется на «храним увиденное в множестве и ищем дополнение до суммы за O(1)».