找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]
示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
正解
回溯暴力求解
class Solution {
List<List<Integer>> list=new ArrayList<List<Integer>>();
List<Integer> temp=new ArrayList<Integer>();
public List<List<Integer>> combinationSum3(int k, int n) {
getList(k, n, 1);
return list;
}
void getList(int k,int n,int start) {
if(temp.size()==k) {
int sum=0;
for(int i:temp) {
sum+=i;
}
if(sum==n) {
list.add(new ArrayList<>(temp));
}
return;
}
for(int i=start;i<=9;i++) {//在1-9之间历遍所有k个数组合情况
temp.add(i);
getList(k, n, i+1);
temp.remove((Object)i);
}
}
}
剪枝优化
class Solution {
List<List<Integer>> list=new ArrayList<List<Integer>>();
List<Integer> temp=new ArrayList<Integer>();
public List<List<Integer>> combinationSum3(int k, int n) {
getList(k, n, 1);
return list;
}
void getList(int k,int n,int start) {
if(temp.size()==k) {
int sum=0;
for(int i:temp) {
sum+=i;
}
if(sum==n) {
list.add(new ArrayList<>(temp));
}
return;
}
for(int i=start;i<=9-(k-temp.size())+1;i++) {//进行剪枝操作【9-(k-temp.size())+1】
temp.add(i);
getList(k, n, i+1);
temp.remove((Object)i);
}
}
}