题意:给一个n,一个k,求1到n的所有数字的全排列按从小到大顺序排列的第k大的数
分析:可以参考康托编码2333,不过自己想也想得明白,比如说n=5的话,求第一个数字时每个数都有4!组子数,也就是/4!也就得到了开头的那个数字,然后数字是不能重复的,依次类推就能求出所有的数,注意整除时那里得处理下,也就是一些细节问题就行
AC:
class Solution {
public:
string getPermutation(int n, int k) {
string s(n,'0');
string ans;
int f=1;
int index;
for(int i=1;i<=n;i++)
{
s[i-1]=i;
f*=i;
}//s:1,2,3,4,5
while(n)
{
f/=n;//不断求(n-1)!
index=k/f;
if(k%f==0)
index--;
ans+=s[index]+'0';
s.erase(s.begin()+index);
k-=index*f;
n--;
}
return ans;
}
};
本文介绍了一种求解1到n所有数字全排列中第k大的数的算法。通过递归分解问题规模,利用阶乘计算每一轮选择数字的可能性,从而确定目标排列。文章提供了一个C++实现示例。
219

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



