Условие задачи

Дан массив nums из n + 1 целых чисел, где каждое число находится в диапазоне от 1 до n включительно. В массиве есть только одно повторяющееся число, найдите его и верните.

Необходимо решить задачу, не изменяя массив nums и используя только константное дополнительное пространство.

Примеры

Пример 1:

Входные данные: nums = [1,3,4,2,2]

Выходные данные: 2

Пример 2:

Входные данные: nums = [3,1,3,4,2]

Выходные данные: 3

Решение

Шаг 1: Используем алгоритм "Черепаха и заяц"

Алгоритм "Черепаха и заяц" позволяет найти повторяющийся элемент в массиве без модификации самого массива и используя только константное дополнительное пространство. Алгоритм заключается в том, что мы используем два указателя - медленный и быстрый. Медленный указатель двигается на один элемент за раз, а быстрый указатель двигается на два элемента за раз. Если в массиве есть повторяющийся элемент, то рано или поздно быстрый указатель догонит медленный указатель.

Шаг 2: Находим точку схода указателей

Когда быстрый указатель догоняет медленный, мы находимся в цикле. Так как в массиве есть только один повторяющийся элемент, то найденная точка схода указателей является повторяющимся элементом.

Пример

Рассмотрим массив nums = [1,3,4,2,2]

Медленный указатель и быстрый указатель начинают с индекса 0:

Шаг Медленный указатель Быстрый указатель
0 1 3
1 3 2
2 4 4
3 2 2

Быстрый указатель догнал медленный указатель на 3-ем шаге, находим точку схода указателей - элемент с индексом 2. Этот элемент является повторяющимся элементом.