Это был вопрос интервью.
Мне был задан массив из n+1
целых чисел из диапазона [1,n]
. Свойство массива состоит в том, что он имеет k (k>=1)
дубликаты, и каждый дубликат может отображаться более чем в два раза. Задача состояла в том, чтобы найти элемент массива, который происходит более одного раза в максимально возможной временной и пространственной сложности.
После значительной борьбы я с гордостью придумал решение O(nlogn)
, которое занимает пространство O(1)
. Моя идея состояла в том, чтобы разделить диапазон [1,n-1]
на две половины и определить, какая из двух половин содержит больше элементов из входного массива (я использовал принцип Pigeonhole). Алгоритм продолжается рекурсивно, пока не достигнет интервала [X,X]
, где X
происходит дважды, а это дубликат.
Интервьюер был удовлетворен, но потом он сказал мне, что существует решение O(n)
с постоянным пространством. Он щедро предложил несколько советов (что-то связанное с перестановками?), Но я понятия не имел, как придумать такое решение. Предполагая, что он не лжет, кто-нибудь может предложить рекомендации? Я искал SO и нашел несколько (более простых) вариантов этой проблемы, но не этот конкретный. Спасибо.
EDIT: чтобы сделать вещи еще более сложными, интервьюер отметил, что входной массив не должен быть изменен.