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);
}
}
本文介绍了一种高效算法,用于找出数字集合[1,2,3,...,n]中所有可能排列的第k个序列。通过避免全排列的生成,该方法在n和k较大时仍能快速找到答案。
235

被折叠的 条评论
为什么被折叠?



