77. 组合
思路:
回溯算法,1、确定返回值和类型,2、确定终止条件,3、递归、回溯
for循环来横向遍历(选元素),递归进入下一层循环,组合问题注意不能重复(包括顺序)。
代码:
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> paths = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return res;
}
private void backtracking(int n, int k, int startindex){
if(paths.size() == k){
res.add(new ArrayList<>(paths));
return;
}
for(int i = startindex; i <= n - (k - paths.size()) + 1; i++){//剪枝优化
paths.add(i);
backtracking(n, k, i + 1);
paths.removeLast();
}
}
}
需要注意的点:
1、优化过程:
-
已经选择的元素个数:path.size();
-
还需要的元素个数为: k - path.size();
-
在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历