题目:
The set[1,2,3,…,n]contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
- "123"
- "132"
- "213"
- "231"
- "312"
- "321"
Given n and k, return the k th permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
题意:
集合[1,2,3,…,n]总共包含n!独特的排列。
通过列出并标记所有排列的顺序,
我们得到如下序列(即n = 3时):
“123”
“132”
“213”
“231”
“312”
“321”
给定n和k,返回第k个排列序列。
注:给定n包括1和9在内。
解题思路:
1.回溯法
用数组num[i]记录 1-n的数字,在回溯的过程中,当 count == k 返回res。详细可以看代码注释
//返回结果
String res = "";
//统计组合数
int count = 0;
public String getPermutation(int n, int k) {
int[] num = new int[n];
for(int i = 1;i <= n;i++ ) {
num[i-1] = i;
}
helper(num,k,n,"");
return res;
}
void helper(int[] num ,int k, int n, String str) {
//一个组合完毕
if(n == 0) {
count++;
//覆盖之前的组合
res = "" + str;
return;
}
for(int i = 0; i < num.length;i++) {
//当数字为0时,跳过这次循环
if(num[i] == 0) {
continue;
}
str += num[i];
//当前数字在这次组合中已经被用过,做个标识置0
num[i] = 0;
helper(num,k,n-1,str);
if(count == k) {
break;
}
//重新恢复使用
num[i] = i+1;
//后退,删除最后一个字符
str = str.substring(0, str.length() - 1);
}
}
2.通过找规律来解决