次のような整数の順列1、...、を考えてみましょう。nn = 6
[5,2,4,3,6,1]
順列をから[1,2,3,4,5,6]へのマッピングとして表示する場合[5,2,4,3,6,1]、順列は互いに素なサイクルに分解できます。サイクルは、相互にマッピングされる要素のサブセットです。たとえば、1にマッピングされます5。これはにマッピングされ6、にマッピングされ1ます。したがって、1サイクルは[1,5,6]です。他のサイクルがある[2]と[3,4]。したがって、この順列のサイクル数は3です。
一般に、順列のサイクルは一意で(最大)、サイズの順列のサイクル数nはから1に変化しnます。
チャレンジ
空でない順列が与えられた場合、そのサイクル数を出力します。
入力によって形成された配列であるn整数1、2、...、nどこ、n > 0。各整数は1回だけ出現します。上記の例のように、それらが現れる順序は順列を定義します。
配列の代わりに、リスト、数字の間の区切り文字を持つ文字列、各数字の個別の入力、または妥当なものを使用できます。
サイズの順列でnは、1から始まる整数のセット1...の代わりにn、0から始まるセット0... を一貫して使用できますn-1。もしそうなら、あなたの答えでそれを示してください。
コードは、のために働く必要がありますnまで20、妥当な時間で1分未満を言います。
コードゴルフ。すべてのビルトインが許可されます。
テストケース
これは、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]。