题目描述
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
问题分析
此题是一道DFS题,DFS函数有两个可变参数:left和out。其中left是下一位数的下限,out数组则保存了当前位以及之前的。进入DFS函数后,遍历当前位可能的数,依次加入到out中去,每加入一位数之后,调用DFS函数进行下面的递归,DFS函数返回后,要将out数组中当前位的数删除,为接下来在当前位加入下一个数作准备。遍历当前位可能的数时,不只需要下限,还要算出可能数的上限,这里利用了各位的数是递增的特性,上限用式子n - k + out.size() + 1算出。递归基是当out中数的多少已经等于k时,加入到ans中并返回。最后当第一位的数也遍历结束后,返回ans。
代码实现
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
vector<int> out;
DFS(1, out, n, k, ans);
return ans;
}
void DFS(int left, vector<int>& out, int& n, int& k, vector<vector<int>>& ans){
if(out.size() == k){
ans.push_back(out);
return;
}
for(int i = left; i <= n - k + out.size() + 1; i++){
out.push_back(i);
DFS(i + 1, out, n, k, ans);
out.pop_back();
}
return;
}
};