Быстрый и медленный указатели

Найти дубликат

Найти повторяющееся число без изменения массива

Средний

Постановка задачи

Описание (LeetCode - 287. Find the Duplicate Number)

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

В массиве есть ровно одно повторяющееся число. Нужно вернуть это число.

Массив нельзя изменять. Решение должно использовать только O(1) дополнительной памяти.

Пример 1:

nums = [1, 3, 4, 2, 2]

Результат:

2

Пример 2:

nums = [3, 1, 3, 4, 2]

Результат:

3

Пример 3:

nums = [3, 3, 3, 3, 3]

Результат:

3

Ограничения:

  • 1 <= n <= 10⁵
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • В массиве есть ровно одно повторяющееся число, но оно может встречаться больше двух раз

Решение

Первое простое решение - отсортировать массив и найти соседние одинаковые числа. Но условие запрещает изменять массив, а сортировка копии потребует O(n) памяти.

Второе простое решение - использовать хеш-множество посещенных чисел. Это тоже требует O(n) памяти.

Оптимальный способ - представить массив как связный список и применить алгоритм Флойда (быстрый и медленный указатели).

Перейдите на Premium, чтобы продолжить

Разблокируйте доступ к этой статье и всем остальным материалам с NowInterview Premium

Перейти на Premium