Day24——回溯算法Ⅰ
- 77.组合
今日内容:
● 理论基础
● 77. 组合
理论:代码随想录
77.组合
思路:k层for循环,不会
回溯,将组合问题抽象成n叉树,for循环控制宽度,递归的深度控制二叉树的深度
循环终止条件:集合中存在k个数
vector<vector<int>> res;vector<int> path;
public:void backtracking(int n, int k, int startIndex) {// 递归终止——深度控制if(path.size() == k) {res.push_back(path);return;} // 宽度控制,已访问元素不再访问for(int i = startIndex; i <= n; i++) {path.push_back(i);// 递归访问其余元素直到数组大小达标backtracking(n, k, i + 1);// 回溯,已访问叶子节点拿出path.pop_back();}return;}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return res;}
剪枝:
上述代码在进行递归时,必须要保证至少存在k个元素,即path.size()(集合中已有元素)+ (n - i + 1) (剩余可访问元素)>= k; 这样集合的元素个数才是满足k个的。
i <= n - k + path.size() + 1
void backtracking(int n, int k, int startIndex) {// 递归终止——深度控制if(path.size() == k) {res.push_back(path);return;} // 宽度控制,已访问元素不再访问for(int i = startIndex; i <= n - k + path.size() + 1; i++) {path.push_back(i);// 递归访问其余元素直到数组大小达标backtracking(n, k, i + 1);// 回溯,已访问叶子节点拿出path.pop_back();}return;}