Permutation Sequence
first time:列出所有排列,输出第K个 Time Limit Exceeded
class Solution {
public:
void recursive(vector<vector<int>>&vec,vector<int> vec_t,int cur,int end,int k)
{
if (cur>end)
{
vec.push_back(vec_t);
}
else
{
for (int i=cur;i<=end;i++)
{
swap(vec_t[i],vec_t[cur]);
recursive(vec,vec_t,cur+1,end,k);
swap(vec_t[i],vec_t[cur]);
}
}
}
void findsequence(vector<vector<int>>&vec,int n,int k)
{
vector<int> vec_t;
for (int i=1;i<=n;i++)
{
vec_t.push_back(i);
}
recursive(vec,vec_t,0,n-1,k);
}
string getPermutation(int n, int k) {
vector<vector<int>> vec;
string str;
findsequence(vec,n,k);
//size_t size=vec[k-1].size();
vector<int> tem=vec.back();
int size=tem.size();
for(int i=0;i<size;i++)
{
char ch=tem[i]+48;
str+=ch;
}
return str;
}
};
second time:数值解法(lehmer码)
假设数组为[1,2,3,4],求第6个排列,分别计算各个位上lehmer码
第一位 5/3!=0余5,商为lehmer码,余数作为下一位lehmer码的被除数
第二位 5/2!=2余1
第三位 1/1!=1余0
第四位 0(最后一位总是0)
那么,第一个位置上,取数组的第0个即1,数组变为[2,3,4];
第二个位置上,取数组的第2个即4,数组变为[2,3];
第三个位置上,取数组的第1个即2,数组变为[3];
第四个位置上,取数组的第0个即3;
那么组合即为1432;
class Solution {
public:
string getPermutation(int n, int k) {
string str;
list<int> list_t;
int factorial=1;
for(int i=1;i<=n;i++)
{
list_t.push_back(i);
factorial*=i;
}
int lehmer=k-1,next_lehmer=0;
list<int>::iterator ite;
for(int i=0;i<n;i++)
{
ite=list_t.begin();
factorial/=(n-i);
int index=lehmer/factorial;
for (int j=0;j<index;j++)
{
ite++;
}
char ch=*(ite)+48;
str+=ch;
list_t.erase(ite);
lehmer%=factorial;
}
return str;
}
};

浙公网安备 33010602011771号