回溯算法
组合(优化
res.add(path);这样是错的,相当于添加了path的引用,path变,res里面的值也会变。所以要新建副本。
i<=n-(k- path.size())+1很关键的剪枝。
class Solution {
List<Integer> path=new ArrayList<>();
List<List<Integer>> res=new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
combineHelper(1,n,k);
return res;
}
private void combineHelper(int startindex,int n,int k){
if(n==0||k==0) return;
if(path.size()==k){
res.add(new ArrayList<>(path));
return;
}
for(int i=startindex;i<=n-(k- path.size())+1;i++){
path.add(i);
combineHelper(i+1,n,k);
path.removeLast();
}
}
}