找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合了。 示例 2:
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/combination-sum-iii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k,n,1,0);
return result;
}
public void backtracking(int k,int n,int startIndex,int sum){//这里的sum直接定义为全局变量,或者作为参数传进来
if(sum>n) return;//剪枝操作
if(path.size()==k){
if(sum==n) result.add(new ArrayList<>(path));//符合条件的,所有数相加之和是n的就添加到结果集合中
return;
}
for(int i=startIndex; i<=9 - (k - path.size())+1; i++){//这里循环的条件用的是剪枝
path.add(i);
sum+=i;//让sum累加,就是添加到了path集合中,就累加
backtracking(k,n,i+1,sum);//递归
path.remove(path.size()-1);//回溯
sum-=i;//回溯
}
}
}