方法:回溯
剪枝操作
class Solution {
public List<List<Integer>>resul=new ArrayList<>();
public List<Integer>path=new ArrayList<>();
static int sum=0;
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k,n,1);
return resul;
}
public void backtracking(int k,int n,int start)
{
//减去和的枝条
if(sum>n)
return;
//终止条件
if(path.size()==k)
{
if(sum==n)
resul.add(new ArrayList<Integer>(path));
return;
}
//单层递归逻辑
//横向遍历
//减枝:9-(k-path.size())+1,减去个数的枝条
for(int i=start;i<=9-(k-path.size())+1;i++)
{
path.add(i);//处理结点
sum=sum+i;
backtracking(k,n,i+1);//递归
sum=sum-i;
path.remove(path.size()-1);//回溯,撤销处理结果
}
}
}