Ваш код только проверяет, совпадает ли элемент в массиве с его непосредственным предшественником.
Если ваш массив начинает сортироваться, это будет работать, потому что все экземпляры определенного числа будут смежными.
Если ваш массив не отсортирован для начала, это не сработает, потому что экземпляры определенного числа могут быть не смежными, поэтому вам нужно просмотреть все предыдущих чисел, чтобы определитьбыл ли он еще замечен.
Чтобы выполнить задание за O (N log N), вы можете отсортировать массив, а затем использовать логику, которая вам уже нужна, чтобы удалить дубликаты из отсортированного массива.Очевидно, что это полезно только в том случае, если у вас все в порядке с перестановкой чисел.
Если вы хотите сохранить исходный порядок, вы можете использовать что-то вроде хэш-таблицы или набора битов, чтобы отслеживать, имеет ли числобыло видно или нет, и копируйте каждое число на выход только тогда, когда / если оно еще не было видно.Чтобы сделать это, мы изменим ваш текущий:
if (a[k] != a[i])
a[k+1] = a[i];
на что-то вроде:
if (!hash_find(hash_table, a[i])) {
hash_insert(hash_table, a[i]);
a[k+1] = a[i];
}
Если все ваши числа попадают в довольно узкие границы или вы ожидаете, что значения будут плотными (т.е.большинство значений присутствует) вы можете использовать битовый набор вместо хеш-таблицы.Это будет просто массив битов, установленный в ноль или единицу, чтобы указать, было ли определенное число еще замечено.
С другой стороны, если вас больше волнует верхняя граница сложности, чемВ среднем случае вы можете использовать сбалансированную коллекцию на основе дерева вместо хеш-таблицы.Обычно это использует больше памяти и работает медленнее, но его ожидаемая сложность и сложность в наихудшем случае практически идентичны (O (N log N)).Типичная хеш-таблица вырождается из постоянной сложности в линейную сложность в худшем случае, которая изменит вашу общую сложность с O (N) на O (N 2 ).