题目地址:216.排列组合
1.问题思路
这题与LeetCode 77.组合大同小异。
主要存在一下两点差异:
① 终止条件下需要加入一个额外Condition:currSum=n。
② 每层的广度优先遍历区间为【1,9】,对于已经使用过的元素需要进行剪枝
2.代码实现
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> result = new ArrayList<>();
dfs(result, new ArrayList<>(), k, n, 0, 1);
return result;
}
public void dfs(List<List<Integer>> result, List<Integer> item, int k, int n, int currSum, int start) {
// 已经选择了k个数, 则不能再选取。
if (item.size() == k) {
// 总和等于n,添加到结果集中
if (currSum == n) {
result.add(new ArrayList<>(item));
}
return;
}
// 每层的广度优先遍历
for (int i = start; i <= 9; i++) {
item.add(i);
currSum += i;
recursion(result, item, k, n, currSum, i+1);
currSum -= i; // 回溯
item.remove(item.size() -1);
}
}
}