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
So the most straightforward way is to generate the number one by one. just traverse from tail and get the first smaller element. then swap and sort, you'll get the answer.
however, for large n and k, it will be very slow. so the insight here is that if p = k / (n-1)!, then the first element is arr[p]
public class Solution {
public String getPermutation(int n, int k) {
// Start typing your Java solution below
// DO NOT write main() function
char b[]=new char[n];
for(int i=0;i<n;i++) b[i]=(char)('0'+i+1);//first initialize 12345...
return new String(mutation(b,n,k));
}
public char[] mutation(char b[],int n, int k) {
if(k==1) return b;
int t=1,h=1;
while(k>h&&t<n){
t++;
h*=t;
}
h/=t;
t--;
int m=(k-1)/h;
char a=b[n-t-1];
b[n-t-1]=b[n-t-1+m];//get the first element and swap with the corresponding element
for(int i=n-t-1+m;i>n-t;i--) b[i]=b[i-1];//shift
b[n-t]=a;
return mutation(b,n,k-m*h);
}
}