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.
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; } } };