文章目录
- 60. 排列序列
- 解题思路
- Go代码
60. 排列序列
60. 排列序列
给出集合 [1,2,3,...,n]
,其所有元素共有 n!
种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3
时, 所有排列如下:
- “123”
- “132”
- “213”
- “231”
- “312”
- “321”
给定 n
和 k
,返回第k
个排列。
示例 1:
输入:n = 3, k = 3
输出:"213"
示例 2:
输入:n = 4, k = 9
输出:"2314"
示例 3:
输入:n = 3, k = 1
输出:"123"
提示:
- 1 <= n <= 9
- 1 <= k <= n!
解题思路
经典回溯题目
Go代码
func getPermutation(n int, k int) string {
// 先用回溯法求出所有的排列,然后取出第k个即可
res := make([]string,0)
path := ""
// 注意数字从1开始取的,可以取n,所以这里切片长度是n+1,否则取used[n]会索引越界
used := make([]bool,n+1)
backtrack(n,k,&res,path,used)
return res[k-1]
}
func backtrack(n,k int,res *[]string,path string,used []bool) {
// 已经取够k个的时候,可以直接返回了,剪枝
if len(*res) == k{
return
}
if len(path) == n {
*res = append(*res,path)
return
}
for i := 1;i <= n;i++{
if used[i] {
continue
}
used[i] = true
backtrack(n,k,res,path + fmt.Sprintf("%d",i),used)
used[i] = false // 回溯
}
}