Pertimbangkan permutasi bilangan bulat 1
, ... n
,, seperti ini untuk n = 6
:
[5,2,4,3,6,1]
Jika Anda melihat permutasi sebagai pemetaan dari [1,2,3,4,5,6]
ke [5,2,4,3,6,1]
, permutasi dapat didekomposisi menjadi siklus terpisah . Siklus adalah subset elemen yang saling memetakan. Misalnya, 1
dipetakan ke 5
, yang dipetakan ke 6
, yang dipetakan kembali ke 1
. Jadi satu siklus [1,5,6]
. Siklus lainnya adalah [2]
dan [3,4]
. Jadi jumlah siklus untuk permutasi ini adalah 3
.
Secara umum, siklus permutasi adalah unik (sesuai pesanan), dan jumlah siklus untuk permutasi ukuran n
bervariasi dari 1
hingga n
.
Tantangan
Dengan permutasi yang tidak kosong, outputkan jumlah siklusnya.
Input adalah sebuah array yang dibentuk oleh n
bilangan bulat 1
, 2
, ..., n
, mana n > 0
. Setiap bilangan bulat terjadi tepat satu kali. Urutan di mana mereka muncul mendefinisikan permutasi, seperti pada contoh di atas.
Alih-alih array, Anda dapat menggunakan daftar, string dengan pemisah antara angka, input terpisah untuk setiap angka, atau apa pun yang masuk akal.
Untuk permutasi ukuran n
, bukannya set integer berbasis 1 1
, ..., n
Anda dapat secara konsisten menggunakan set berbasis 0 0
, ..., n-1
. Jika demikian, harap tunjukkan dalam jawaban Anda.
Kode harus bekerja n
hingga 20
waktu yang wajar, katakanlah kurang dari satu menit.
Golf kode. Semua bawaan diizinkan.
Uji kasus
Ini mengasumsikan input array berbasis 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
Terkait
Tantangan terkait ini menanyakan siklus aktual dari permutasi, bukan jumlah mereka. Hanya membutuhkan jumlah siklus yang dapat menyebabkan algoritma yang lebih pendek yang menghindari menghasilkan siklus yang sebenarnya.
1
, ..., n
dalam urutan itu. Bisakah Anda mengklarifikasi bagaimana pemetaan bisa menjadi input? Apakah ini struktur data?
dict
. Saya ingin memiliki {1: 2, 2: 1}
sebagai input, bukan [2, 1]
.