● 模板
1.思路
2.代码实现
● 77. 组合
1.思路
这道题的难点应该在于写出整个代码后优化剪枝那部分。
接下来看一下优化过程如下:
已经选择的元素个数:path.size();
还需要的元素个数为: k - path.size();
在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历
为什么有个+1呢,因为包括起始位置,我们要是一个左闭的集合。
举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。
从2开始搜索都是合理的,可以是组合[2, 3, 4]。
这里大家想不懂的话,建议也举一个例子,就知道是不是要+1了。
2.代码实现
class Solution {
LinkedList<Integer> path=new LinkedList<>();
List<List<Integer>> result= new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
bathtracking(n,k,1);
return result;
}
public void bathtracking(int n,int k, int StartIndex){
if(path.size()==k){
result.add(new ArrayList<>(path));
return;
}
for(int i=StartIndex;i<=(n-(k-path.size())+1);i++){
path.add(i);
bathtracking(n,k,i+1);
path.removeLast();
}
return;
}
}