Математически невозможно найти дубликаты в O(1)
. Вы должны проверить все N
элементы массива хотя бы один раз , чтобы проверить, является ли каждый из них дубликатом. Это не менее N
операций, поэтому нижняя граница сложности составляет O(N)
.
Подсказка: вы можете сделать это в O(N)
, если вы используете (скажем) HashSet
для записи каждого значения, которое вы уже видели. Загвоздка в том, что HashSet
является пространственно-ориентированной структурой данных.
Пожалуйста, предоставьте предложения / альтернативные методы для сортировки массива, я сталкивался с этой проблемой много раз.
Простой способ сортировки массива целых чисел - использовать Arrays::sort(int[])
. Это будет O(NlogN)
.
Теоретически возможно отсортировать массив целых чисел лучше, чем O(NlogN)
, но только если вы можете поместить границу в диапазон целого числа. Поиск вверх подсчет сортировки . Сложность составляет O(max(N, R)
, где R
- это разница между наименьшим и наибольшим числом. Подвох в том, что O(R)
может быть намного больше, чем O(N)
... в зависимости от входных данных.
Но если вы знаете, что M
, вероятно, будет меньше, чем NlogN
, вы можете использовать вариант сортировки счетчиков и использовать только O(M)
бит дополнительного пространства для дедупликации массива в O(max(M, N))
. (Я оставлю вас, чтобы выяснить детали.)