您的位置:首页 > 产品设计 > UI/UE

LC60 Permutation Sequence

2016-04-02 19:15 399 查看
这道题目有两种做法,第一种是把排列一直列到第k个。另一种做法是利用康托编码,如果把n!个排列根据首个数字大小排列成n组,则每一组有(n-1)!个元素,求第k个排列,可以先令p=k/(n-1)! 求出第一个数字num[p].

然后递归做下去。更新数字k=k%(n-1)!,并在数组num中删除num[p]。如果把(n-1)!个排列根据第二个数字大小排列成(n-1)组,则每一组有(n-2)!个元素,求第k个排列,可以令p=k/(n-2)! 求出第二个数字num[p].

这样直到数组num中只有一个元素为止。

要特别注意,康托编码的第k个排列是从0开始数的。

class Solution {
public:
string getPermutation(int n, int k) {
string s="";
if(n<=0||k<=0)
return s;
int tmp=1;
string str(n,'0');
for(int i=1;i<=n;i++)
{
str[i-1]+=i;
tmp*=i;
}
tmp=tmp/n;
k--;
for(int i=n-1;i>0;i--)
{
int p=k/tmp;
k=k%tmp;
s+=string(1,str[p]);
str.erase(str.begin()+p);
tmp=tmp/i;
}
s+=string(1,str[0]);
return s;
}
};


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: