1. Використовуючи додатковий простір O (1), за час O (n log n)
Це можливо, наприклад:
- спочатку виконайте сортування O (n log n) на місці
- потім пройдіться по списку один раз, написавши перший екземпляр кожного назад до початку списку
Я вважаю, що партнер ejel правильний, що найкращим способом зробити це буде сортування на місці зі спрощеним кроком злиття, і це, мабуть, є метою питання, якщо ви, наприклад, були. написання нової функції бібліотеки, щоб зробити це якомога ефективніше, не маючи можливості вдосконалити вхідні дані, і бувають випадки, що було б корисно робити це без хеш-таблиці, залежно від виду входів. Але я насправді цього не перевіряв.
2. Використовуючи додатковий простір O (багато), за час O (n)
- оголосити нульовий масив, достатньо великий, щоб вмістити всі цілі числа
- пройдіться по масиву один раз
- встановіть для відповідного елемента масиву значення 1 для кожного цілого числа.
- Якщо це вже було 1, пропустіть це ціле число.
Це працює, лише якщо виконується кілька сумнівних припущень:
- можливо обнулити пам’ять дешево, або розмір дюймів невеликий порівняно з їх кількістю
- Ви із задоволенням попросите у своєї ОС пам’ять 256 ^ sizepof (int)
- і він кешує його для вас дійсно ефективно, якщо він гігантський
Це погана відповідь, але якщо у вас БАГАТО вхідних елементів, але всі вони 8-бітові цілі числа (або, можливо, навіть 16-бітові цілі числа), це може бути найкращим способом.
3. O (мало) -іш зайвий простір, O (n) -іш час
Як №2, але використовуйте хеш-таблицю.
4. Ясний шлях
Якщо кількість елементів невелика, написання відповідного алгоритму не корисно, якщо інший код швидше пишеться і швидше читається.
Напр. Пройдіться по масиву для кожного унікального елемента (тобто першого елемента, другого елемента (дублікати першого видалено) тощо), видаливши всі однакові елементи. O (1) зайвий простір, O (n ^ 2) час.
Напр. Використовуйте функції бібліотеки, які роблять це. ефективність залежить від того, який у вас є легко доступний.