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个排列,因为只需返回第k个,所以不用将所有的排列组合都求出来,只求出第k个排列组合即可,重点在于找出排序和k的规律。
参考:喜刷刷
Python:
class Solution(object): def getPermutation(self, n, k): """ :type n: int :type k: int :rtype: str """ seq, k, fact = "", k - 1, math.factorial(n - 1) perm = [i for i in xrange(1, n + 1)] for i in reversed(xrange(n)): curr = perm[k / fact] seq += str(curr) perm.remove(curr) if i > 0: k %= fact fact /= i return seq
C++:
class Solution { public: string getPermutation(int n, int k) { string ret; vector<int> factorial(n,1); vector<char> num(n,1); for(int i=1; i<n; i++) factorial[i] = factorial[i-1]*i; for(int i=0; i<n; i++) num[i] = (i+1)+'0'; k--; for(int i=n; i>=1; i--) { int j = k/factorial[i-1]; k %= factorial[i-1]; ret.push_back(num[j]); num.erase(num.begin()+j); } return ret; } };
C++:
class Solution { public: string getPermutation(int n, int k) { string res; string num = "123456789"; vector<int> f(n, 1); for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i; --k; for (int i = n; i >= 1; --i) { int j = k / f[i - 1]; k %= f[i - 1]; res.push_back(num[j]); num.erase(j, 1); } return res; } };
类似题目:
[LeetCode] 46. Permutations 全排列
[LeetCode] 47. Permutations II 全排列 II
[LeetCode] 31. Next Permutation 下一个排列
All LeetCode Questions List 题目汇总