medium程度题
题目:
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"
class Solution {
public:
string getPermutation(int n, int k)
{
string s(n,'0');
for (int i = 0; i <= n; i++)
s[i] += i + 1;
return kth_permutation(s,n,k);
}
//求阶乘
int fac(int n)
{
int result = 1;
for (int i = 1; i <= n; i++)
result *= i;
return result;
}
string kth_permutation(string s,int n,int k)
{
string result;
int base = fac(n - 1);
k--;
bool used[n + 1];
for (int i = 1; i < n + 1; i++)
used[i] = false;
for (int i = 1; i < n; i++)
{
int m = k / base;
k %= base;
base /= (n -i);
//从used数组中找m个未使用的数,第m + 1个未使用的数就是第i位的值
int a = 0,index;
for (int i = 1; i < n + 1; i++)
{
if (!used[i])
a++;
if (a == m + 1)
{
index = i;
break;
}
}
result.push_back(s[index - 1]);
used[index] = true;
}
//最后一个未被使用的数放入字符串尾
int a;
for (int i = 1; i < n + 1; i++)
if (!used[i])
{
a = i - 1;
break;
}
result.push_back(s[a]);
return result;
}
};
参考了别人的解法,复杂度为O(n),真是精妙
class Solution {
public:
string getPermutation(int n, int k)
{
string s(n,'0');
for (int i = 0; i <= n; i++)
s[i] += i + 1;
return kth_permutation(s,n,k);
}
int fac(int n)
{
int result = 1;
for (int i = 1; i <= n; i++)
result *= i;
return result;
}
string kth_permutation(string s,int n,int k)
{
string result;
int base = fac(n - 1);
k--;
for (int i = n - 1; i > 0; k %= base,base /= i,i--)
{
int m = k / base;
result.push_back(*(s.begin() + m));
s.erase(s.begin() + m);
}
result.push_back(s[0]);
return result;
}
};
直接将使用了的擦除,避免了每次对数组进行搜索,极大的降低了复杂度,妙!
712



被折叠的 条评论
为什么被折叠?



