题目链接
216. 组合总和 III
题目描述
找出所有相加之和为 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]]
说明:
所有数字都是正整数。
解集不能包含重复的组合。
解题思路
经典回溯
有了上面回溯算法的整体框架,就非常容易写出整个代码啦,主要还是联想到递归树,递归结束条件顺序的判断!
AC代码
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
int[] vist = new int[10];
void dfs(int start,int k,int n,int num){
//必须先判断当个数等于k时候,tot值是否等于n,如果等于加入ans中,如果不等于则返回(回溯)
int tot = 0;
for(int i = 0; i < temp.size(); i++) tot += temp.get(i);
if(tot == n && num == k){
ans.add(new ArrayList<>(temp));
return;
}
//要注意递归返回条件的先后顺序
if(num == k) return;
for(int i = start; i <= 9; i++){
if(vist[i] == 0){
vist[i] = 1;
temp.add(i);
num++;
dfs(i+1,k,n,num);
num--;
temp.remove(temp.size() - 1);
vist[i] = 0;
}
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
dfs(1,k,n,0);
return ans;
}
}