Это звучит как домашняя работа или вопрос на собеседовании ... так что вместо того, чтобы давать ответ, вот подсказка.
Какие вычисления вы можете сделать для целого ряда, ответ на который вы можете определитьдосрочно?
Как только вы поймете ответ на этот вопрос, вы сможете понять это ... если вы все еще не можете понять это ... (и это не домашняя работа) Я будуопубликовать решение:)
РЕДАКТИРОВАТЬ: ОК.Итак, вот элегантное решение ... если список содержит ВСЕ целые числа в пределах диапазона.
Мы знаем, что все значения от 1 до N должны присутствовать в списке.Используя Guass 'формулу , мы можем быстро вычислить ожидаемое значение диапазона целых чисел:
Sum(1..N) = 1/2 * (1 + N) * Count(1..N).
Поскольку мы знаем ожидаемую сумму, все, что нам нужно сделать, - это перебрать все значенияи суммировать их значения.Различие между этой суммой и ожидаемой суммой является дублирующим значением.
РЕДАКТИРОВАТЬ: Как прокомментировали другие, вопрос не утверждает, что диапазон содержит все целые числа ... в этом случае вы должны решить, хотите ли вы оптимизировать память или время.
Если вы хотите выполнить операцию с использованием O (1) хранилища ,Вы можете выполнить сортировку списка по месту.При сортировке вы должны проверять соседние элементы.Как только вы увидите дубликат, вы знаете, что можете остановиться.Оптимальная сортировка - это операция O (n log n) в среднем, которая устанавливает верхнюю границу для поиска дубликата таким образом.
Если вы хотите оптимизировать по скорости, вы можете использовать дополнительный O(n) хранилище .Используя HashSet (или аналогичную структуру), вставляйте значения из своего списка, пока не решите, что вставляете дубликат в HashSet.Вставка n элементов в HashSet - это в среднем операция O (n), которая устанавливает это как верхнюю границу для этого метода.