Рассмотрим перестановку целых чисел 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]
.