Permutation Sequence
Mar 28 '12
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 kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
public class Solution {
public String getPermutation(int n, int k) {
// Start typing your Java solution below
// DO NOT write main() function
if(k<0) return new String();
k = k-1;
LinkedList<Character> can = new LinkedList<Character>();
for(int i=0; i<n;i++) {
can.add( (char)(i+'1') );
}
char[] res = new char[n];
int i=0;
int p=0;
while(i<n) {
int f = getFactorial(n-i-1);
p = k/f;
res[i++] = can.get(p);
can.remove(p);
k = k % f;
}
return new String(res);
}
private int getFactorial(int n) {
if(n==0) return 1;
int x = n;
while(--n>0) x *= n;
return x;
}
}
improved version. permutation type problem. use swap or pool to keep every element only show once.
public class Solution {
public String getPermutation(int n, int k) {
// Start typing your Java solution below
// DO NOT write main() function
/*123
132
213
231
312
321
n=3, k=5
*/
//check input
if(n<1) return "";
List<Integer> pool = new ArrayList<Integer>();
for(int i=1; i<=n; i++) {
pool.add(i);
}
int sum = 1;
for(int i=1; i<n; i++) {
sum *= i;
}
k-=1;
StringBuilder sb = new StringBuilder();
for(int i=0; i<n-1; i++) {
int x = k/sum;
sb.append( pool.get(x) );
pool.remove(x);
k %= sum;
sum /= (n-1-i);
}
sb.append( pool.get(0) );
return sb.toString();
}
}