找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
一、代码实现(回溯法)
funccombinationSum3(k int, n int)[][]int{var res [][]intvar backtrack func(start int, path []int, sum int)backtrack =func(start int, path []int, sum int){iflen(path)== k {if sum == n {tmp :=make([]int, k)copy(tmp, path)res =append(res, tmp)}return}for i := start; i <=9; i++{// 剪枝:总和超过目标值if sum+i > n {break}// 剪枝:剩余数字不足remaining := k -len(path)-1if9-i < remaining {break}backtrack(i+1,append(path, i), sum+i)}}backtrack(1,[]int{},0)return res
}
classSolution{publicList<List<Integer>>combinationSum3(int k,int n){List<List<Integer>> res =newArrayList<>();backtrack(1, k, n,newArrayList<>(), res);return res;}privatevoidbacktrack(int start,int k,int remain,List<Integer> path,List<List<Integer>> res){if(path.size()== k){if(remain ==0) res.add(newArrayList<>(path));return;}for(int i = start; i <=9; i++){if(i > remain)break;if(9- i < k - path.size()-1)break;path.add(i);backtrack(i +1, k, remain - i, path, res);path.remove(path.size()-1);}}}
classSolution:defcombinationSum3(self, k:int, n:int)-> List[List[int]]:res =[]defbacktrack(start, path, total):iflen(path)== k:if total == n:res.append(path.copy())returnfor i inrange(start,10):if total + i > n:breakif9- i < k -len(path)-1:breakpath.append(i)backtrack(i+1, path, total+i)path.pop()backtrack(1,[],0)return res