组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
思路+代码+注释:
public List<List<Integer>> combinationSum3(int k, int n) {
/*
思路:找k个和为n的数,可以分成k个阶段每个阶段找一个数,找数时如果当前剩余和小于0说明该情况不符合要求回溯找下一个数
,当剩余和为0并且out集合元素个数等于k时说明找到符合要求的集合,将out集合添加到结果集合中返回
*/
List<Integer> out=new ArrayList<>();
List<List<Integer>> res=new ArrayList<>();
combinationSum3(k,n,out,res,1);
return res;
}
/*
n代表剩余的和
*/
private void combinationSum3(int k,int n,List<Integer> out,List<List<Integer>> res,int weiZhi)
{
if (n<0)
{
return;
}
if (n==0 && out.size()==k)
{
res.add(new ArrayList<>(out));
return;
}
for (int i = weiZhi; i < 10; i++) {
out.add(i);
combinationSum3(k,n-i,out,res,i+1);
out.remove(out.size()-1);
}
}