Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]01 背包法实现会比较简单些。另一种是每次以不同的开头进行遍历@详见代码!这个处理第一次碰到问题。主要注意下一个位置!
vector<vector<int> > combine(int n, int k) {
if(k > n || k < 1 || n < 1)return vector<vector<int> >();
vector<int> res_one;
vector<vector<int> > res;
combine_recur(n,k,1,res_one,res);
return res;
}
void combine_recur(int n,int k,int level,vector<int>& res_one,vector<vector<int> > &res)
{
if(res_one.size() == k)
{
res.push_back(res_one);
return ;
}
if(level > n)
{
return ;
}
res_one.push_back(level);
combine_recur(n,k,level+1,res_one,res);//加入
res_one.pop_back();
combine_recur(n,k,level+1,res_one,res);//0不加入
}
第二次:
vector<vector<int> > combine(int n, int k) {
if(k > n || k < 1 || n < 1)return vector<vector<int> >();
vector<int> res_one;
vector<vector<int> > res;
combine_recur(n,k,0,1,res_one,res);
return res;
}
void combine_recur(int n,int k,int level,int index,vector<int>& res_one,vector<vector<int> > &res)
{
if(level >= k)
{
res.push_back(res_one);
return ;
}
for(int i = index; i <= n;i++)
{
res_one.push_back(i);
combine_recur(n,k,level+1,i+1,res_one,res);//注意细节此处是 i+1 非index+1!!
res_one.pop_back();
}
}