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