题目如下:
解题思路:
DFS + 剪枝 + 回溯 。注意进入每一层时的剪枝条件。
代码如下:
class Solution{
public:
vector<vector<int>> combine(int n, int k){
vector<vector<int>> res; //存放结果
vector<int> nums(n); //用于剪枝的原始数组
for(int i = 0; i < n; i++){
nums[i] = i + 1;
}
backtrackcombine(k, 0, res, nums);
return res;
}
void backtrackcombine(int k, int pos, vector<vector<int>>& res, vector<int>& nums){
//若已找到 k 个值,记录并返回
if(nums.size() == k){
res.push_back(nums);
return ;
}
//否则,遍历子节点
for(int i = pos; i < nums.size(); i++){
vector<int> temp(nums); //暂存,以备回溯
nums.erase(nums.begin() + i); //删除头部节点,进入下一层节点
backtrackcombine(k, i, res, nums); //递归,dfs
nums = temp; //恢复,回溯
}
}
};