题目
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],
]
思路
利用递归,遍历可选集,每次往tmp里加入可选集中一个元素,然后将之后的元素扔入下一个递归中,寻找k-1个元素,如果k==0,则说明元素选择已经完成,则加入result中。然后抹去之前加入tmp元素中加入的可选集一个元素,继续遍历可选集。
代码
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
vector<int> tmp;
helper(result, tmp, 1, n, k);
return result;
}
void helper(vector<vector<int>>& result, vector<int>& tmp, int start, int n, int k) {
if (k == 0) {
result.push_back(tmp);
return;
}
for (int i = start; i <= n; i++) {
tmp.push_back(i);
helper(result, tmp, i+1, n, k-1);
tmp.erase(tmp.end()-1);
}
}
};