Рассмотрим перестановку целых чисел 1, ... n, такую как эта для n = 6:
[5,2,4,3,6,1]
Если вы рассматриваете перестановку как отображение из [1,2,3,4,5,6]в [5,2,4,3,6,1], перестановка может быть разложена на непересекающиеся циклы . Цикл - это подмножество элементов, которые отображаются друг на друга. Например, 1сопоставляется 5, сопоставляется 6, сопоставляется обратно 1. Итак, один цикл есть [1,5,6]. Другие циклы [2]и [3,4]. Таким образом, число циклов для этой перестановки равно 3.
В общем, циклы перестановки являются уникальными (с точностью до порядка), и число циклов для перестановки размера nварьируется от 1до n.
Соревнование
Если дана непустая перестановка, выведите количество циклов.
Входной массив , образованный nцелых чисел 1, 2, ..., n, где n > 0. Каждое целое число встречается ровно один раз. Порядок, в котором они появляются, определяет перестановку, как в примере выше.
Вместо массива вы можете использовать список, строку с разделителем между числами, отдельный ввод для каждого числа или все, что разумно.
Для перестановки размера nвместо набора целых чисел на основе 1 1, ... nможно последовательно использовать набор на основе 0 0, ..., n-1. Если это так, пожалуйста, укажите это в своем ответе.
Код должен работать nдо , чтобы 20в течение разумного времени, скажем , менее чем за одну минуту.
Код гольф. Все встроенные разрешены.
Контрольные примеры
Это предполагает ввод с массива на основе 1.
[1] -> 1
[3,2,1] -> 2
[2,3,4,5,1] -> 1
[5,2,4,3,6,1] -> 3
[8,6,4,5,2,1,7,3] -> 2
[4,5,11,12,7,1,3,9,10,6,8,2] -> 1
[4,2,5,11,12,7,1,3,9,10,6,8] -> 5
[5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3
[14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7
Связанный
В этой связанной задаче запрашиваются фактические циклы перестановок, а не их количество. Требование только количества циклов может привести к более коротким алгоритмам, которые обходят создание фактических циклов.
1, ..., nв этом порядке. Можете ли вы уточнить, как отображение может быть входом? Это структура данных?
dict. Я хочу иметь {1: 2, 2: 1}в качестве входа вместо [2, 1].