LintCode-第k个排列

给定 n 和 k,求123..n组成的排列中的第 k 个排列。

样例

对于 n = 3, 所有的排列如下:

123
132
213
231
312
321

如果 k = 4, 第4个排列为,231.

注意

1 ≤ n ≤ 9

分析:可以提前计算好不同的k个数有多少个排列,然后一位一位的确定,比如n=3,k=3的情况下,要确立第一位的时候,后面两个数可以产生2个不同的排列,那么第一位肯定应该是2,如果是1的话,k最多为2,如果是3的话,k最小为5,所以确定第一位是2,然后再用同样方法确定后面的每一位。

代码:

class Solution {
public:
	/**
	* @param n: n
	* @param k: the kth permutation
	* @return: return the k-th permutation
	*/
	string getPermutation(int n, int k) {
		int cnt[10];
		cnt[0] = 1;
		for (int i = 1; i < 10; i++)
			cnt[i] = cnt[i - 1] * i;
		map<int, bool> m;
		string ret = "";
		for (int i = 1; i <= n; i++)
		{
			int t = (k / cnt[n - i]) + (k%cnt[n - i] == 0 ? 0 : 1);
			if (i == n)
				t = 1;
			k -= (t - 1)*cnt[n - i];
			int j = 1;
			for (; j <= n; j++)
			{
				if (!m[j])
				{
					t--;
					if (t == 0)
						break;
				}
			}
			m[j] = true;
			char c = '0' + j;
			ret += c;
		}
		return ret;
	}

};

    原文作者:LintCode题目解答
    原文地址: https://blog.csdn.net/wangyuquanliuli/article/details/45727457
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞