77. 组合
回溯的第一道题目,与递归的思路差不多,都是三部曲:
1、递归函数的返回值和参数
2、回溯函数终止条件
3、单层搜索的过程
首先回溯一般递归函数都是 void类型,参数可以慢慢根据需要确定。
void backtracking(int n,int k,int index){
其次,本题终止条件明显是达到了组合要求的数字个数,便返回上一层,退出递归。
if(path.size()==k){
result.push_back(path);
return;
}
最后则是单层需要处理的节点、集合,首先需要定义两个全局变量用来记录数字:
vector<vector<int>>result;
vector<int>path;
并在每一层的递归回溯中往path中塞入数据、剔除数据,要求在递归之前塞入,递归之后去除:
for(int i=index;i<=n;i++){
path.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
并额外定义计数指标index用来指示没一层递归应该从哪个数字开始记录。
总的来说,可以将组合问题想象成树,从而简化思路,方便理解。