1.题目描述:
找出所有相加之和为n的k个数的组合。组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数;解集不能包含重复的组合。
2.回溯:
解法与图解leetcode77. 组合几乎一样。
class Solution {
private List<List<Integer>> resList = new ArrayList<>();
private List<Integer> list = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k, n, 0);
return resList;
}
public void backTracking(int k, int n, int index) {
if (list.size() == k) {
int sum = 0;
for (Integer item : list) sum += item;
if (sum == n) resList.add(new ArrayList<>(list));
return;
}
for (int i = index; i < 9; i++) {
list.add(i + 1);
backTracking(k, n, i + 1);
list.remove(list.size() - 1);
}
}
}
3.回溯两处剪枝:
class Solution {
private List<List<Integer>> resList = new ArrayList<>();
private List<Integer> list = new ArrayList<>();
private int sum = 0;
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k, n, 0);
return resList;
}
public void backTracking(int k, int n, int index) {
if (sum > n) return;//求和超过范围剪枝
if (list.size() == k) {
if (sum == n) resList.add(new ArrayList<>(list));
return;
}
for (int i = index; i < 9 - (k - list.size()) + 1; i++) {//子集个数剪枝
list.add(i + 1);
sum += i + 1;//求和放到循环里
backTracking(k, n, i + 1);
list.remove(list.size() - 1);//回溯
sum -= i + 1;//sum也需要回溯
}
}
}