思路: 回溯是一种穷举——>遍历一个集合只选一个元素,遍历子集(下层)再次只选择一个元素(注意从之后选不重复),形成的合法路径就是合法组合
借大佬的思路图代码随想录
优化:剪枝操作
class Solution {
public:
vector<vector<int>> results;//结果
vector<int> path;//栈
vector<vector<int>> combine(int n, int k) {
dfs(1, n, k);
return results;
}
void dfs(int start, int end, int k)
{
if(end - start + 1 < k - path.size()) return;//剪枝,后面元素个数不够无需穷举
if(path.size() == k) {//path已经组成k个数,加入results
results.push_back(path);
return;
}
for(int i = start; i <= end; ++i)
{
path.push_back(i);//放入i
dfs(++start, end, k);//进入下一层子集
path.pop_back();//回退,选择其他路径
}
}
};