一眼递归,第一版写出的代码写成了排列组合,然后修改后:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> vec;
vector<vector<int>> result;
for(int i=1;i<=n;i++){
vec.push_back(i);
}
vector<int> v;
hs(result,v,k,vec);
return result;
}
void hs(vector<vector<int>> &result,vector<int> v,int k,vector<int> vec){
if(v.size()==k){result.push_back(v);return ;}
for(int i=0;i<vec.size();i++){
v.push_back(vec[i]);
vector<int> vv(vec);
vv.erase(vv.begin(),vv.begin()+i+1);
sc(vv);
hs(result,v,k,vv);
v.pop_back();
}
}
void sc(vector<int> v){
for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
cout<<endl;
}
};
看了答案写出来的,不需要一开始就用数组记录,直接用数字表示即可。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
vector<int> v;
hs(result,v,k,n);
return result;
}
void hs(vector<vector<int>> &result,vector<int> &v,int k,int n){
if(n+v.size()<k) return ;
if(v.size()==k){result.push_back(v);return ;}
v.push_back(n);
hs(result,v,k,n-1);
v.pop_back();
hs(result,v,k,n-1);
}
};