leetcode:Permutation Sequence

Permutation Sequence Total Accepted: 3357 Total Submissions: 16092 My Submissions
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.


Note: Given n will be between 1 and 9 inclusive.

利用康托编码的思路,假设有n 个不重复的元素,第k 个排列是a1; a2; a3; :::; an,那么a1 是
哪一个位置呢?
代码:
class Solution {
public:
	string getPermutation(int n, int k)
	{
		int ResArray[10];
		int finalArray[10];
		for (size_t i =n; i >=1; i--)
		{
			ResArray[i-1] = (k-1)/numArray[i-1];
			k -= ResArray[i-1] * numArray[i-1];
		}
		for (size_t i = n; i >=2; i--)
		{
			finalArray[i] = sArray[ResArray[i-1] + 1];
			con(ResArray[i-1] + 1);

		}
		finalArray[1] = sArray[1];
		int final = finalArray[n];
		for (int i = n-1; i >=1; i--)
		{
			final = final * 10 + finalArray[i];
		}
		stringstream ss;
		ss << final;
		return ss.str();

		

	}
public:
	int mul(int n)
	{
		int k = 1;
		while (n >= 2)
		{
			k *= n;
			n--;
		}
		return k;
	}
public:
	void con(int n)
	{
		for (size_t i = n; i < 9; i++)
		{
			sArray[i] = sArray[i + 1];
		}
	}
private: int numArray[9];
private: int sArray[10];
public: Solution()
		 {
			 sArray[9] = 9;
			 for (size_t i = 1; i <= 8; i++)
			 {
				 numArray[i] = mul(i);
				 sArray[i] = i;
			 }
		 }
};




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值