文章目录
- 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] = truebacktrack(n,k,res,path + fmt.Sprintf("%d",i),used)used[i] = false // 回溯}
}