Permutation Sequence

假设有n个元素,第K个permutation是
a1, a2, a3, .....   ..., an
把a1去掉,那么剩下的permutation为
a2, a3, .... .... an, 共计n-1个元素。 n-1个元素共有(n-1)!组排列
设变量K1 = K
a1 = K1 / (n-1)!
同理,a2的值可以推导为
a2 = K2 / (n-2)!
K2 = K1 % (n-1)!
 .......
a(n-1) = K(n-1) / 1!
K(n-1) = K(n-2) /2!

an = K(n-1)

需要注意的一个地方是an表示剩下的数(按照升序排列)中的第an个

class Solution {
public:
	string getPermutation(int n, int k) {
		vector<int> nums(n);
		int nfac = 1;
		for (int i = 0; i < n; ++i) {
			nums[i] = i + 1;
			nfac *= (i + 1);
		}//nfac初始化为n的阶乘,fac是factorial(阶乘)

		k--;
		string res = "";
		for (int i = 0; i < n; i++) {
			nfac = nfac / (n - i);//第一次循环变成n-1的阶乘,以此类推
			int selected = k / nfac;//selected表示剩下的数(顺序排列)中第selected个

			res += ('0' + nums[selected]);
			
			nums.erase(nums.begin() + selected);//删除已经被取走的数
			k = k % nfac;
		}
		return res;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值