Если даны два целых числа k и n, напишите функцию, которая печатает все последовательности длины k, состоящие из чисел 1,2..n. Вам нужно распечатать эти последовательности в отсортированном порядке.
Примеры:
Input: k = 2, n = 3 Output: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Input: k = 3, n = 4 Output: 1 1 1 1 1 2 1 1 3 1 1 4 1 2 1 ..... ..... 4 3 4 4 4 1 4 4 2 4 4 3 4 4 4
Метод 1 (простой и итеративный):
Простая идея напечатать все последовательности в отсортированном порядке — начать с {1 1… 1} и продолжать увеличивать последовательность, пока последовательность не становится {nn… n}. Ниже приводится подробный процесс.
1) Создайте выходной массив arr [] размера k. Инициализируйте массив как {1, 1… 1}.
2) Распечатать массив arr [].
3) Обновите массив arr [], чтобы он стал непосредственным преемником (подлежащим печати) самого себя. Например, непосредственным преемником {1, 1, 1} является {1, 1, 2}, непосредственным преемником {1, 4, 4} является {2, 1, 1} и непосредственным преемником {4, 4, 3 } есть {4 4 4}.
4) Повторите шаги 2 и 3, пока существует последующий массив. Другими словами, хотя выходной массив arr [] не становится {n, n .. n}
Теперь давайте поговорим о том, как изменить массив так, чтобы он содержал непосредственный преемник. По определению, непосредственный преемник должен иметь те же первые p членов и больший (p + 1) -й член. В исходном массиве (p + 1) -й член (или arr [p]) меньше n и всех членов после arr [p], т. Е. Arr [p + 1], arr [p + 2],… arr [ k-1] — это n.
Чтобы найти непосредственного преемника, мы находим точку p в ранее напечатанном массиве. Чтобы найти точку p, мы начинаем с крайней правой стороны и продолжаем двигаться, пока не найдем число arr [p] такое, что arr [p] будет меньше n (или не n). Как только мы находим такую точку, мы увеличиваем ее arr [p] на 1 и делаем все элементы после arr [p] равными 1, т. Е. Делаем arr [p + 1] = 1, arr [p + 2] = 1. . arr [k-1] = 1. Ниже приведены подробные шаги для получения немедленного преемника arr [].
1) Начните с самого правого члена arr [k-1] и двигайтесь влево. Найдите первый элемент arr [p], который не совпадает с n.
2) Увеличение обр [р] на 1
3) Начиная с arr [p + 1] до arr [k-1], установите значение всех слагаемых как 1.
|
Джава
|
C #
|
Выход:
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Сложность времени: Есть всего n ^ k последовательностей. Печать последовательности и поиск ее преемника занимают O (k) времени. Таким образом, временная сложность вышеописанной реализации составляет O (k * n ^ k).
Метод 2 (хитрый и рекурсивный)
Рекурсивная функция printSeptionsRecur генерирует и печатает все последовательности длиной k. Идея состоит в том, чтобы использовать еще один параметр index. Функция printSeptionsRecur хранит все термины в arr [] sane до индексации, обновляет значение по индексу и рекурсивно вызывает себя для получения дополнительных терминов после индексации.
|
Джава
|
python3
|
C #
|
PHP
|
Выход:
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Сложность времени: есть n ^ k последовательностей, и печать последовательности занимает O (k) время. Таким образом, сложность времени O (k * n ^ k).
Спасибо mopurizwarriors за предложенный выше метод. Как предлагает alphayoung , мы можем избежать использования массивов для небольших последовательностей, которые могут помещаться в целое число. Ниже приводится реализация для того же.
|
Джава
|
python3
|
C #
|
PHP
|
Ссылки:
Алгоритмы и программирование: проблемы и решения Александр Шен
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Вывести все возрастающие последовательности длины k из первых n натуральных чисел
- Количество последовательностей длиной N, произведение которых равно M
- Найти все двоичные последовательности четной длины с одинаковой суммой первого и второго половинных битов | итеративный
- Выведите все не увеличивающиеся последовательности суммы, равной заданному числу x
- Вывести все самые длинные общие подпоследовательности в лексикографическом порядке
- Вывести всю перестановку длины L, используя элементы массива | итеративный
- Найти сумму суммы всех подпоследовательностей
- Программа для определения длины моста с использованием скорости и длины поезда
- Подсчет количества подпоследовательностей с GCD 1
- Подсчитать общее количество последовательностей четной суммы
- Количество подпоследовательностей, которые удовлетворяют данному условию
- Проверьте, существуют ли две одинаковые подпоследовательности в строке или нет
- Подсчитать все подпоследовательности, имеющие произведение <= K — Рекурсивный подход
- Сумма минимального элемента всех подпоследовательностей отсортированного массива
- Минимальное количество последовательных последовательностей, которые могут быть сформированы в массиве
0.00 (0%) 0 votes