LeetCode 60 排列序列
阿新 • • 發佈:2018-12-20
1 題目描述
我們知道集合[1,2,3,...,n]共包含n!個排列。以n=3為例,其有序全排列如下。
"123"
"132"
"213"
"231"
"312"
"321"
本題給定n,求其有序全排列中的第k個。
注:n介於區間[1,9],k介於區間[1,n!]。
例子1:
輸入:n = 3, k = 3
輸出:"213"
例子2:
輸入:n = 4, k = 9
輸出:"2314"
2 解決思路
首先根據k找到需要計算的最小子序列,假定找到的該子序列的長度為i,針對該序列分別將第[0,i-1]個元素至於頭部的序列共有i*(i-1)!個全排列。所以根據該規律,對於給定的k,即可計算出第幾個元素需至於頭部,然後將k重置為餘數,再對其子序列遞迴計算結果。
func factorial(i int) int { f := 1 for ; i >= 1; i-- { f *= i } return f } func getPermutaion(s string, k int) string { i := len(s) if 1 == i { return s } factorial := factorial(i) nextFactorial := factorial / i if k <= nextFactorial { return s[:1] + getPermutaion(s[1:], k) } c, k := (k-1)/nextFactorial, (k-1)%nextFactorial+1 if c > 0 { s = string(s[c]) + s[:c] + s[c+1:] } return getPermutaion(s, k) } func getPermutation(n int, k int) string { s := "" for i := 1; i <= n; i++ { s += strconv.Itoa(i) } return getPermutaion(s, k) }