Combinations
Given two integersnandk, return all possible combinations ofknumbers out of 1 ...n.
For example,
Ifn= 4 andk= 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
1 递归一次,填入一个数字
2 填入的数字,不能是小于当前数字的值,防止重复
3 回溯:记得pop_back()最后加上的一个数字,回溯到上一层。
4 结束条件:填写够了k个数字的时候,当前填写完毕,回溯
vector<vector<int> > combine(int n, int k)
{
vector<vector<int> > v;
if (k > n || k==0) return v;
vector<int> mv;
comb(v, mv, n, k, 1);
return v;
}
void comb(vector<vector<int> > &v, vector<int> &mv, int n, int k, int start)
{
for (int i = start; i <= n; i++)
{
mv.push_back(i);
if (mv.size() == k)
{
v.push_back(mv);
mv.pop_back();
continue;
}
//i<n条件可以不加,因为递归的时候也自动判断排除这个条件了
if (i < n) comb(v, mv, n, k, i+1);
mv.pop_back();
}
}
递归的另外一种写法:
void comb2(vector<vector<int> > &v, vector<int> &mv, int n, int k, int start)
{
if (mv.size() == k)
{
v.push_back(mv);
return;
}
for (int i = start; i <= n; i++)
{
mv.push_back(i);
comb2(v, mv, n, k, i+1);
mv.pop_back();
}
}
//2014-2-12 update
vector<vector<int> > combine(int n, int k)
{
vector<vector<int> > rs;
if (k<1 || n<k) return rs;
vector<int> tmp;
helper(rs, tmp, n, k);
return rs;
}
void helper(vector<vector<int> > &rs,vector<int> &tmp, int n, int k, int begin = 1)
{
if (!k)
{
rs.push_back(tmp);
return;
}
for (int i = begin; i <= n; i++)
{
tmp.push_back(i);
helper(rs,tmp,n,k-1,i+1);
tmp.pop_back();
}
}