找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
正常回溯算法,爆搜就是简单无脑!
注意这题的限制,既有总和又有数字要求,不能重复能算要求吗?我DFS带个start,就能确保不重复啦!
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>>ans=new ArrayList<>();
List<Integer>path=new ArrayList<Integer>();
for(int i=1;i<=9;i++){
path.add(i);
dfs(ans, path, n-i,k-1,i+1);
path.remove(path.size()-1);
}
return ans;
}
void dfs(List<List<Integer>>ans,List<Integer>path,
int n,int k,int start){
if(n<0||k<0){
return;
}
if(k==0&&n==0){
ans.add(new ArrayList<>(path));
}
for(int i=start;i<=9;i++){
path.add(i);
dfs(ans, path, n-i,k-1,i+1);
path.remove(path.size()-1);
}
}
}