题目:
分析:
还是根据排列组合基本问题全排列 II中给的两种方法改编。
代码1(朴素直接修改原来的模板):
int all=-1;
int f(int nums,vector<int> n,int c,int k,vector<int>& v)
{//该往c位置放了
if(c==n.size()-1){
all++;
if(all==k-1) return 1;
return 0;
}
for(int i=1;i<=nums;i++)
{
if(n[i]) continue;
n[i]=1;
v[c]=i;
int kk=f(nums,n,c+1,k,v);
if(kk) return 1;
n[i]=0;
}
return 0;
}
int main()
{
int nums=3;
int k=3;
vector<int> n(nums+1,0);//使用过吗
vector<int> v(nums,0);//记录是哪个
f(nums,n,0,k,v);
string ss="";
for(int i=0;i<v.size();i++) ss+=(v[i]+'0');
cout<<ss;
}
结果:超时了!!!o(╥﹏╥)o
不过代码时没问题的。
结合数学方法找:
思路是没必要枚举出所有的结果。3个数,3!中,这样从高位到低位逐个定。