考虑整数... ... 的置换,例如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]
。