题目描述:
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.
解题思路:
刚看到题时,第一反应就是模拟啦,反正会全排列的算法,一个一个next不就行了!哼~题目才不会这么简单呢~一定会让你超时的说!
那就再仔细想想吧~
还是老方法,打比方,比如现在的序列是 a,b,c,d,那么(序列号从0开始标,方便操作):
以a开头的序列号为0~5
以b开头:6~11
以c开头:12~17
以d开头:18~23
同时看出来,当确定第一个数位置之后,后面的数的位置确定方法类似.
所以首先根据k(根据题目来说,需要对k减一)判断出第一个位置的字符.即用k/(n-1)! 值为0~n-1,接下来k=k%(n-1),n=n-1;迭代直至k=0为止
解题代码:
public String getPermutation(int n, int k) {
per=new int[n+1];
per[0]=1;
for(int i=1;i<=n;i++)per[i]=i*per[i-1];//事先计算一下n!
chs=new char[n];
for(int i=0;i<n;i++)
chs[i]=(char)((i+1)+'0');//用数组来模拟字符,这样,就不局限在数字的排序,而是任意可比较的字符
int kk=k-1;
int i=0;
int nn=n;
while(kk!=0)
{
int tmp=kk/per[nn-1];
shift(i,tmp+i);
i++;
kk=kk%per[nn-1];
nn-=1;
}
return new String(chs);
}
public void shift(int i,int j)
{
char c=chs[j];
for(int k=j;k>i;k--)chs[k]=chs[k-1];
chs[i]=c;
}
private int[] per;
private char[] chs;