Сверьте каждый элемент с каждым другим элементом
Наивным решением является проверка каждого элемента на предмет соответствия каждому другому элементу. Это расточительно и дает решение O (n 2 ), даже если вы идете только вперед.
Сортировка и удаление дубликатов
Лучшее решение - отсортировать массив, а затем проверить каждый элемент рядом с ним, чтобы найти дубликаты. Выберите эффективную сортировку, и это O (n log n).
Недостатком решения на основе сортировки является то, что порядок не поддерживается. Однако об этом может позаботиться дополнительный шаг. Поместите все записи (в уникальный отсортированный массив) в хеш-таблицу с доступом O (1). Затем переберите исходный массив. Для каждого элемента проверьте, находится ли он в хэш-таблице. Если это так, добавьте его к результату и удалите из хеш-таблицы. В результате вы получите результирующий массив, имеющий порядок оригинала, причем каждый элемент находится в той же позиции, что и его первое вхождение.
Линейные виды целых чисел
Если вы имеете дело с целыми числами некоторого фиксированного диапазона, вы можете добиться еще лучших результатов, используя радикальную сортировку. Если вы предполагаете, что все числа находятся в диапазоне от 0 до 1 000 000, например, вы можете выделить битовый вектор примерно 1 000 001. Для каждого элемента в исходном массиве вы устанавливаете соответствующий бит на основе его значения (например, значение 13 приводит к установке 14-го бита). Затем просмотрите исходный массив, проверьте, находится ли он в битовом векторе. Если это так, добавьте его в массив результатов и очистите этот бит от вектора битов. Это O (n) и меняет пространство на время.
Решение для хеш-таблицы
Что приводит нас к лучшему решению из всех: на самом деле этот вид отвлекает, хотя и полезен. Создайте хеш-таблицу с доступом O (1). Пройдите оригинальный список. Если его еще нет в хеш-таблице, добавьте его в массив результатов и добавьте в хеш-таблицу. Если он находится в хеш-таблице, игнорируйте его.
Это, безусловно, лучшее решение. Так зачем отдыхать? Потому что подобные проблемы связаны с адаптацией имеющихся у вас (или должны быть) знаний к проблемам и их уточнением на основе предположений, которые вы делаете в решении. Разрабатывать решение и понимать его мышление гораздо полезнее, чем извергать решение.
Кроме того, хеш-таблицы не всегда доступны. Возьмите встроенную систему или что-то, где пространство ОЧЕНЬ ограничено. Вы можете реализовать быструю сортировку в нескольких кодах операций, гораздо меньше, чем в любой хэш-таблице.