专题四:综合练习(组合问题的决策树与回溯算法)
以leetode77题为例
题目分析:
给一个数字n,你可以在1到n中选k个数字进行组合,注意包括1和n,而且通过观察实例
1,2和2,1是一样的,所以我们画决策树的时候,只需要从当前位置往后列举
算法原理分析:
第一步:画决策树:越详细越好
代码设计:
1.全局变量:我需要一个vector<vector<int>>ret数组去搜集每个叶子节点
我需要一个path去标记路径,一旦到了叶子结点就放到ret中
还有一个是n+k-1,这个可以设计成dfs函数参数传递下去
2.dfs函数:dfs列举从当前位置开始往后,比如上一层已经罗列1,这一层就2开始
并且要传index++,标记罗列到什么为止,dfs(int pos,int index);
当path.size()==k时就是叶子结点
3.细节:回溯:恢复现场,返回上一层时需要pop
剪枝:这里没必要,因为我通过index标记了每一层罗列到什么位置即可
递归出口:path.size()==k时,即当是叶子结点时就返回