LC60 Permutation Sequence

这道题目有两种做法,第一种是把排列一直列到第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开始数的。

 1 class Solution {
 2 public:
 3     string getPermutation(int n, int k) {
 4         string s="";
 5         if(n<=0||k<=0)
 6             return s;
 7         int tmp=1;
 8         string str(n,'0');
 9         for(int i=1;i<=n;i++)
10         {
11             str[i-1]+=i;
12             tmp*=i;
13         }
14         tmp=tmp/n;
15         k--;
16         for(int i=n-1;i>0;i--)
17         {
18             int p=k/tmp;
19             k=k%tmp;
20             s+=string(1,str[p]);
21             str.erase(str.begin()+p);
22             tmp=tmp/i;
23         }
24         s+=string(1,str[0]);
25         return s;
26     }
27 };
View Code

 

转载于:https://www.cnblogs.com/vaecn/p/5348064.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值