问题描述:
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], ]
问题分析:
由题意可知,一般对于穷举组合个数的问题可以采用深度优先搜索的思想来考虑,即构建一个最后返回结果的结果数组,然后递归地去穷举可能出现的元素组合,单次穷举结果放入待输出数组中。观察题目中所给出的例子,不难看出,当选定前一个元素的值后,下一个待选定元素的值一定比上一个要大,因而每一层都尝试将剩下比当前元素要大的元素顺序逐个与待输出数组进行拼接,当被拼接后的待输出数组的长度达到问题所要求的参数k值时,即将其放入结果数组中。当完成整个递归后返回结果。
代码如下:
class Solution {
public:
vector> combine(int n, int k) {
vector> res;
vector element;
select(res,element,n,1,k);
return res;
}
void select(vector> &res,vector &element, int n, int start, int t)
{
if(element.size()==t)
res.push_back(element);
else
{
for(int i=start;i<=n;i++)
{
element.push_back(i);
select(res,element,n,i+1,t);
element.pop_back();
}
}
}
};