1. 程式人生 > >LeetCode 60 排列序列

LeetCode 60 排列序列

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)  
}