给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
// 因为每次回溯的起始下标不一样,所以回溯函数的参数加一个起始下标
void backtracking(int n, int k, int startIndex)
{
// 终止条件
if(path.size() == k)
{
result.push_back(path);
// 终止语句中怎么可以少了 return 呢?
return;
}
// for 循环就是横向遍历
// 加了剪枝操作的 哦~就是这句 i<=n - (k - path.size()) + 1
for(int i = startIndex; i<=n - (k - path.size()) + 1; i++)
{
path.push_back(i);
// 递归就是向下(即纵向)遍历,注意下一层的搜索需要改变一下起始位置
// 递归后面紧接着的一句就是回溯,为的是要撤销处理的节点
backtracking(n, k, i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k)
{
// 在工程应用中通常需要写,刷题时其实无所谓的啦~~
result.clear();
path.clear();
backtracking(n, k, 1);
return result;
}
};