77.组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
这就是个暴力搜索的问题,但是如果k=50,我们就要写50层循环,这是不现实的。回溯算法就是将k层for循环转换成k层递归深度,从而让我们可以把代码写出来。
1、问题抽象与代码实现
1)将该问题抽象为树形结构:
2)代码实现
class Solution {
private:
/-----回溯算法-----/
vector<vector<int>> res; //用于存放总结果
vector<int> path; //用于存放单个结果
/-----回溯算法返回值为空,参数startIndex为当前节点的开始搜索编号-----/
void backTracking(int n, int k, int startIndex){
/-----如果单个结果存满了,放到总结果中,并返回------/
if(path.size() == k){
res.push_back(path);
return;
}
/-----对于包含[startIndex, n]的节点,我么可以依次取第i个数,分出第i个路径-----/
for(int i = startIndex; i <= n; i++){
path.push_back(i); //将取来的第i个数放到单个结果中
backTracking(n, k, i + 1); //按照第i个路径继续向下递归
path.pop_back(); //递归后回溯