LeetCode - Permutation Sequence **

这题要注意产生的序列要求是有序的!

如果递归生成排列要做到有序有些困难。所以变生成排列边计数的方法可能比较麻烦。

我们知道N个数字有N!种排列。也就是有N组 的(N-1)!个排列。

对于第k个序列,我们可以知道他是属于N组(N-1)!排列中的哪一组。第i组的排列是交换第0个和第i个数字后对剩下的1到N-1的全排列。

以此类推,每次查找其在第几组子排列中并交换元素。更新k值。如果k为0则说明交换后的序列即为所求序列。

因为要有序,所以交换后需要对剩余元素排序。


class Solution {
public:
    string getPermutation(int n, int k) {
		vector<int> f(n+1);
		f[0]=1;
		for(int i=1;i<=n;++i)
			f[i] = i*f[i-1];
		string s;
		for(int i=1;i<=n;++i)
			s.push_back('0'+i-0);
		if(k>f[n])
			return "";
		int idx = 0;
		int m = n-1;
		--k;
		while(true){
			int i = k/f[m];
			k = k%f[m];
			char tmp = s[idx];
			s[idx] = s[i+idx];
			s[i+idx] = tmp;
			sort(s.begin()+idx+1,s.end());
			if(k==0)
				return s;
			++idx;
			--m;
		}
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值