给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3
输出: “213”
示例 2:
输入: n = 4, k = 9
输出: “2314”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
String s = new Solution().getPermutation(3, 3);
System.out.println(s);
}
}
class Solution{
int cnt = 0;
int k;
public String getPermutation(int n, int k) {
this.k = k;
List<List<Integer>> res = new ArrayList<>();
boolean[] visited = new boolean[n];
backtrack(n, k, visited, new ArrayList<>(), res);
List<Integer> ans = res.get(0);
StringBuilder sb = new StringBuilder();
for(int i=0; i<ans.size(); i++) {
sb.append(ans.get(i));
}
return sb.toString();
}
//如何剪枝
private void backtrack(int n, int k, boolean[] visited, List<Integer> path, List<List<Integer>> res) {
if(path.size()==n) {
cnt++;
if(cnt == k)
res.add(new ArrayList<>(path));
return ;
}
for(int i=0; i<n; ++i) {
if(!visited[i]) {
path.add(i+1);
visited[i] = true;
backtrack(n,k, visited, path, res);
visited[i] = false;
path.remove(path.size()-1);
}
}
}
}