LINTCODE——第k个排列
问题:给定 n 和 k,求123..n组成的排列中的第 k 个排列。
思路:n个排列有n!种组合,根据k/(n-1)!来确定左边的数值,这说的说太抽象,举个例子吧;eg:n=5,k = 98,那么k/(n-1)!为num = 4,所以输出的string第一个就是num+1(不过当k%/(n-1)! == 0为特殊情况,额外处理一下就好了),还是看代码吧,跟着代码走一遍数值的变化就知道了;
class Solution {
public:
/*
* @param n: n
* @param k: the k th permutation
* @return: return the k-th permutation
*/
string getPermutation(int n, int k) {
// write your code here
//两个数组,num存储n!的值,number存储1~n;
vector<int> num,number;
for(int i = 1 ,sum = 1; i <= n ; i++)
{
sum *= i;
num.push_back(sum);
number.push_back(i);
}
//边界处理
if(n == 1)
return "1";
int N = num.size() - 1;
if(k > num[N])
return {};
//主要程序
string s = "";
while(k)
{
N--;
int knum = k/num[N];
int kmod = k%num[N];
//当kmod为0时特殊情况,就可以直接结束啦
if(kmod == 0)
{
s += to_string(kthnumber(knum-1,number));
for(int i = number.size()-1 ; i >=0; i--)
s += to_string(number[i]);
return s;
}
s += to_string(kthnumber(knum,number));
k = kmod;
}
}
//根据传递过来的k/n!的值,计算值,并在number中删除该数
int kthnumber(int knum ,vector<int> &number)
{
int temp = number[knum];
number.erase(number.begin()+knum);
return temp;
}
};