题目:
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路:从n个数中取k个数,首先创建一个大小为k的数组tmp,之后依次向tmp[0]到tmp[k-1]赋值,每次赋值完一遍就保存一次tmp,作为一个组合。直到所有组合都被保存完成。
//结果集
vector<vector<int>> res;
//times代表第几次抽取数据,num是对抽取的数做不重复处理
void helper(vector<int> &tmp,int n,int k,int times,int num)
{
if(times==k)
{
res.push_back(tmp);
return;
}
else
{
for(int i=num;i<=n;i++)
{
tmp[times] = i;
helper(tmp,n,k,times+1,i+1);
}
return;
}
}
vector<vector<int>> combine(int n,int k)
{
if(k<=0)
return res;
vector<int> tmp;
//先填充vector,方便一会直接赋值
for(int i=0;i<k;i++)
tmp.push_back(0);
helper(tmp,n,k,0,1);
return res;
}