【ATT】Combinations
求子集合C(n,k)问题;---DFS
vector<vector<int> > combine(int n, int k) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; if(n<=0||k<0||k>n) return result; vector<int> set; subset(0,n,k,set,result); return result; } void subset(int curPos,int& n,int& k,vector<int>& set, vector<vector<int> >& result) { if(set.size()==k) { result.push_back(set); return; } for(int i=curPos;i<n;i++) { set.push_back(i+1); subset(i+1,n,k,set,result); set.pop_back(); } }
另外一种写法:更好理解
vector<vector<int> > combine(int n, int k) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<int> temp; vector<vector<int> > ans; combine_rec(ans , temp , n , k , 1); return ans; } void combine_rec(vector<vector<int> > &ans , vector<int> temp , int n , int k , int index) { if (k == 0) ans.push_back(temp); else if (k > 0 && index <= n) { temp.push_back(index); //选择了index combine_rec(ans , temp , n , k-1 , index+1); //注意k-1 temp.pop_back(); combine_rec(ans , temp , n , k , index+1); //不选择index,注意是k } }