The set [1,2,3,...,n]
contains a total of n! unique permutations.html
By listing and labeling all of the permutations in order, we get the following sequence for n = 3:數組
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.post
Note:url
Example 1:spa
Input: n = 3, k = 3 Output: "213"
Example 2:code
Input: n = 4, k = 9 Output: "2314"
這道題是讓求出n個數字的第k個排列組合,因爲其特殊性,咱們不用將全部的排列組合的狀況都求出來,而後返回其第k個,咱們能夠只求出第k個排列組合便可,那麼難點就在於如何知道數字的排列順序,可參見網友喜刷刷的博客,首先咱們要知道當n = 3時,其排列組合共有3! = 6種,當n = 4時,其排列組合共有4! = 24種,咱們就以n = 4, k = 17的狀況來分析,全部排列組合狀況以下:htm
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412 <--- k = 17
3421
4123
4132
4213
4231
4312
4321blog
咱們能夠發現,每一位上1,2,3,4分別都出現了6次,當最高位上的數字肯定了,第二高位每一個數字都出現了2次,當第二高位也肯定了,第三高位上的數字都只出現了1次,當第三高位肯定了,那麼第四高位上的數字也只能出現一次,下面咱們來看k = 17這種狀況的每位數字如何肯定,因爲k = 17是轉化爲數組下標爲16:排序
最高位可取1,2,3,4中的一個,每一個數字出現3!= 6次(由於當最高位肯定了,後面三位能夠任意排列,因此是3!,那麼最高位的數字就會重複3!次),因此k = 16的第一位數字的下標爲16 / 6 = 2,在 "1234" 中即3被取出。這裏咱們的k是要求的座標爲k的全排列序列,咱們定義 k' 爲當最高位肯定後,要求的全排序列在新範圍中的位置,同理,k'' 爲當第二高爲肯定後,所要求的全排列序列在新範圍中的位置,以此類推,下面來具體看看:ip
第二位此時從1,2,4中取一個,k = 16,則此時的 k' = 16 % (3!) = 4,注意思考這裏爲什麼要取餘,若是對這24個數以6個一組來分,那麼k=16這個位置就是在第三組(k/6 = 2)中的第五個(k%6 = 4)數字。以下所示,而剩下的每一個數字出現2!= 2次,因此第二數字的下標爲4 / 2 = 2,在 "124" 中即4被取出。
3124
3142
3214
3241
3412 <--- k' = 4
3421
第三位此時從1,2中去一個,k' = 4,則此時的k'' = 4 % (2!) = 0,以下所示,而剩下的每一個數字出現1!= 1次,因此第三個數字的下標爲 0 / 1 = 0,在 "12" 中即1被取出。
3412 <--- k'' = 0
3421
第四位是從2中取一個,k'' = 0,則此時的k''' = 0 % (1!) = 0,以下所示,而剩下的每一個數字出現0!= 1次,因此第四個數字的下標爲0 / 1= 0,在 "2" 中即2被取出。
3412 <--- k''' = 0
那麼咱們就能夠找出規律了
a1 = k / (n - 1)!
k1 = k
a2 = k1 / (n - 2)!
k2 = k1 % (n - 2)!
...
an-1 = kn-2 / 1!
kn-1 = kn-2 % 1!
an = kn-1 / 0!
kn = kn-1 % 0!
代碼以下:
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; } };
相似題目:
參考資料:
https://leetcode.com/problems/permutation-sequence/description/
https://leetcode.com/problems/permutation-sequence/discuss/22508/An-iterative-solution-for-reference