Это вопрос интервью, который я использую как упражнение по программированию.
Вход: Два сортированных целочисленных массива A и B в порядке возрастания и разных размеров N и M соответственно
Вывод: Сортированный целочисленный массив C в порядке возрастания, содержащий элементы, которые отображаются как в A, так и в B
Противопоказания: В C
не допускаются дубликаты.Пример: Для ввода A = {3,6,8,9} и B = {4,5,6,9,10,11} выход должен быть C = {6, 9}
Спасибо за ваши ответы, все! Подводя итог, есть два основных подхода к этой проблеме:
Мое первоначальное решение состояло в том, чтобы сохранить два указателя, по одному для каждого массива, и сканировать массивы слева направо взаимозаменяемо, выбирая элементы, которые соответствуют. Поэтому, когда текущий элемент одного массива больше, чем второй массив, мы продолжаем увеличивать указатель второго массива до тех пор, пока мы не найдем текущий первый элемент массива или не пройдем его (наберите больше). Я сохраняю все в отдельном массиве, который возвращается, когда мы доходим до конца любого из входных массивов.
Другой способ, которым мы могли бы это сделать, - это сканировать один из массивов линейно, используя бинарный поиск, чтобы найти совпадение во втором массиве. Это будет означать время O (N * log (M)), если мы сканируем A и для каждого из его N элементов бинарный поиск по времени B (O (log (M))).
Я реализовал оба подхода и провел эксперимент, чтобы увидеть, как эти два сравнения (подробности об этом можно найти здесь). Метод Binary Search, кажется, выигрывает, когда M примерно в 70 раз больше N, когда N имеет 1 миллион элементов.