216.组合总和3
思路
借助前面组合回溯的方法,可以套用到本题中,递归过程中一旦超出题目条件(path.size>k||sum>n)
或达到题目要求(path.size()==k && sum==n)
即返回。
对回溯的写法有了进一步理解,for循环控制的是当前递归层(组合位置)的值,而递归目的是找下一个层(组合位置)的数,传入的startIndex
为确保不重复。
代码
List<List<Integer>> result=new ArrayList<>();
LinkedList<Integer> path=new LinkedList<>();
int sum=0;
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k,n,1);
return result;
}
public void backtracking(int k,int n,int startIndex){
if (path.size()>k || sum>n) return;
if (path.size()==k && sum==n){
result.add(new ArrayList<>(path));
return;
}
for (int i=startIndex;i<9;i++){
path.add(i);
sum=sum+i;
backtracking(k,n,i+1);
path.removeLast();
sum=sum-i;
}
}