正式开始回溯算法
1. 组合
path 每条符合条件的路径
res存放所有路径的结果
递归终止条件,path已经收集够足够k个元素
path的下一个元素要从当前元素的下一个开始,即 i+1 开始
回溯:遍历收集完一位元素就将该元素弹出,回到上一层,继续收集该位元素的下一个
class Solution {
LinkedList<Integer> path = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backTracking(n,k,1);
return res;
}
public void backTracking(int n, int k, int index){
if(path.size() == k){
res.add(new ArrayList<>(path));
return;
}
for(int i = index; i <= n; i++){
path.offerLast(i);
backTracking(n,k,i+1);
path.pollLast();
}
}
}
剪枝
总共n个,需要k个,已经选取了path.size个
那么还需要 k-size 个
那么大于 n - (k-size) + 1 的元素就肯定凑不齐k个元素了, 所以 i 要小于等于这个值
n - (k-size) + 1 单层最多能到的元素