77. 组合https://leetcode-cn.com/problems/combinations/
回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度
class Solution {
List<List<Integer>> resultList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backTracking(n, k, 1);
return resultList;
}
// 确定参数与返回值
void backTracking(int n, int k, int index) {
//终止条件
// 满足结果 就可以终止
if (list.size() == k) {
// 存放结果
resultList.add(new ArrayList(list));
return;
}
// 回溯搜索的遍历过程 (即单层递归逻辑)
for (int i = index; i <= n; i++) {
// 处理节点
list.add(i);
// 递归
backTracking(n, k, i + 1);
// 回溯
list.remove(list.size() - 1);
}
}
}
注意点
1 注意处理节点,即上述代码中的处理节点list.add(i); 不要收集错了,可自行在脑子模拟收集过程
2 注意递归函数的第三个参数,即上述代码的递归backTracking(n, k, i + 1); i+1为每次向下递归后 循环遍历的起始值,可自行在脑子模拟收集过程