class Solution {
private:
vector<vector<int>>res;
public:
void DFS(int n, int k, int start, vector<int>& tem) {
if (tem.size() == k) {
res.push_back(tem);
return;
}
//1这里面含有一步剪枝的操作,i再大,搜索是无意义的,此时搜不到这么长的。
for (int i = start; i <= n - (k - tem.size()) + 1; i++) {
tem.push_back(i);
DFS(n, k, i + 1, tem);
tem.pop_back();
}
return;
}
vector<vector<int>> combine(int n, int k) {
res.clear();
vector<int>tem;
if (n <= 0 || k > n || k <= 0)
return res;
int start = 1;
DFS(n, k, start, tem);
return res;
}
};
注意:对于代码处1的剪枝操作说明
对于
其中代表最后一个数的大小,k代表每个组和包括的数字数量,tem代表目前已经组合好的
所以,(k-tem.size())代表组合还差x个元素,然后n-x+1代表从最后一个数向前推x个位置,如果i再继续往后取值,如上图所示,做的是无用功。