Учитывая два массива A1 [] и A2 [], сортируйте A1 таким образом, чтобы относительный порядок среди элементов был таким же, как в A2. Для элементов, отсутствующих в A2, добавьте их, наконец, в отсортированном порядке.
Пример:
Input: A1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8} A2[] = {2, 1, 8, 3} Output: A1[] = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7, 9}
Код должен обрабатывать все случаи, например, количество элементов в A2 [] может быть больше или меньше по сравнению с A1 []. A2 [] может иметь некоторые элементы, которых может не быть в A1 [], и наоборот, также возможно.
Источник : Amazon Интервью | Комплект 110 (в кампусе)
Мы настоятельно рекомендуем вам нажать здесь и попрактиковаться, прежде чем переходить к решению.
Метод 1 (Использование сортировки и двоичного поиска)
Пусть размер A1 [] равен m, а размер A2 [] равен n.
- Создайте временный массив temp размера m и скопируйте в него содержимое A1 [].
- Создайте еще один массив с именем [] и инициализируйте все записи в нем как ложные. visit [] используется для пометки тех элементов в temp [], которые копируются в A1 [].
- Сортировать темп []
- Инициализируйте выходной индекс ind как 0.
- Выполните следующие действия для каждого элемента A2 [i] в A2 []
- Двоичный поиск всех вхождений A2 [i] в temp [], если имеется, затем скопируйте все вхождения в A1 [ind] и увеличьте ind. Также отметьте скопированные элементы, которые посетили []
- Скопируйте все не посещенные элементы из temp [] в A1 []
,
Ниже приведен пробный запуск вышеуказанного подхода:
Ниже приведена реализация вышеуказанного подхода:
|
Джава
|
python3
|
C #
|
PHP
|
Выход:
Sorted array is 2 2 1 1 8 8 3 5 6 7 9
Временная сложность : шаги 1 и 2 требуют времени O (m) . Шаг 3 требует времени O (M * Log M) . Шаг 5 требует времени O (N Log M) . Следовательно, общая сложность времени составляет O (M Log M + N Log M) .
Спасибо Vivek за предложение этого метода.
Метод 2 (Использование самобалансирующегося бинарного дерева поиска )
Мы также можем использовать самобалансировку BST, такую как AVL Tree , Red Black Tree и т. Д. Ниже приведены подробные шаги.
- Создайте самобалансировку BST всех элементов в A1 []. В каждом узле BST также следует отслеживать количество появлений ключа и посещенное поле bool, которое инициализируется как false для всех узлов.
- Инициализируйте выходной индекс ind как 0.
- Выполните следующие действия для каждого элемента A2 [i] в A2 []
- Найдите A2 [i] в BST, если он есть, затем скопируйте все вхождения в A1 [ind] и увеличьте ind. Также отметьте скопированные элементы, посещенные в узле BST.
- Сделайте обход по BST и скопируйте все не посещенные ключи в A1 [].
Сложность времени этого метода такая же, как и в предыдущем методе. Обратите внимание, что в самобалансирующемся бинарном дереве поиска все операции требуют времени входа в систему.
Способ 3 (использовать хеширование)
- Перейдите к A1 [], сохраните счетчик каждого числа в HashMap (ключ: число, значение: счетчик числа)
- Перейдите через A2 [], проверьте, присутствует ли он в HashMap, если это так, поместите в выходной массив столько раз и удалите число из HashMap.
- Отсортируйте оставшиеся числа в HashMap и поместите в выходной массив.
Спасибо Anurag Sigh за предложение этого метода.
Шаги 1 и 2 в среднем занимают O (m + n) время в предположении, что у нас есть хорошая функция хеширования, которая в среднем занимает O (1) время для вставки и поиска. Третий шаг занимает время O (p Log p), где p — количество элементов, оставшихся после рассмотрения элементов A2 [] .
Метод 4 (написание пользовательского метода сравнения)
Мы также можем настроить метод сравнения алгоритма сортировки для решения вышеуказанной проблемы. Например, qsort () в C позволяет нам передавать собственный метод сравнения .
- Если num1 и num2 оба находятся в A2, то число с более низким индексом в A2 будет считаться меньшим, чем другие.
- Если в A2 присутствует только один из num1 или num2, то это число будет считаться меньшим, чем другое, которого нет в A2.
- Если оба не в A2, то естественный порядок будет взят.
Временная сложность этого метода равна O (mnLogm), если мы используем O (nLogn) алгоритм сортировки по временной сложности. Мы можем улучшить временную сложность до O (mLogm) , используя хеширование вместо линейного поиска.
Ниже приведена реализация этого метода.
|
Выход :
Sorted Array is 2 2 1 1 8 8 3 5 5 5 6 6 7 7 7 9 9
Этот метод основан на комментариях читателей (Xinuo Chen, Pranay Doshi и javakurious) и составлен Анураг Сингхом.
Эта статья составлена Пиюшем . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Сортировать массив строк в алфавитном порядке, определенном другой строкой
- Печатать элементы массива в соответствии с порядком, определенным другим массивом | набор 2
- Сортировать массив, где подмассив отсортированного массива находится в обратном порядке.
- Сортировать простые числа массива в порядке убывания
- Сортировка только не простых чисел массива в порядке возрастания
- Сортировать массив строк дат в порядке возрастания
- Сортировать связанный список в порядке появления элементов в массиве
- Сортировка ведра для сортировки массива с отрицательными числами
- Программа для сортировки массива строк с использованием Selection Sort
- Сортировать все четные числа в порядке возрастания, а затем отсортировать все нечетные числа в порядке убывания
- Перестановка элементов массива в следующем порядке
- Сортировать массив 0, 1 и 2
- Максимальный массив из двух заданных массивов, сохраняющих порядок
- Сортировать почти отсортированный массив с помощью STL
- Как отсортировать массив дат в C / C ++?
0.00 (0%) 0 votes