组合总和3 中等🌟🌟🌟
问题描述
原文链接:216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
提示:
2 <= k <= 91 <= n <= 60
代码实现
Java
class Solution {
//
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTrace(n, k, 1, 0);
return res;
}
void backTrace(int n, int k, int index, int sum){
// 优化
if(sum > n){
return;
}
if((9 - index + 1) + temp.size() < k){
return;
}
// 结束条件
if(temp.size() == k){
if(sum == n){
res.add(new ArrayList<>(temp));
}
return;
}
// 回溯
for(int i = index; i <= 9; i ++){
// 选其中一个元素
temp.add(i);
sum = sum + i;
backTrace(n, k, i + 1, sum);
// 撤销处理
temp.remove(temp.size() - 1);
sum = sum - i;
}
}
}
Python
class Solution(object):
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
res = []
temp = []
def backTrace(n, k, index, sum):
if sum > n:
return
if (9 - index + 1) + len(temp) < k:
return
if len(temp) == k:
if sum == n:
res.append(temp[:])
return
for i in range(index, 10):
temp.append(i)
sum += i
backTrace(n, k, i + 1, sum)
temp.pop()
sum -= i
backTrace(n, k, 1, 0)
return res
C++
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> temp;
function<void(int, int, int, int)> backTrace = [&](int n, int k, int index, int sum) {
if (sum > n) {
return;
}
if ((9 - index + 1) + temp.size() < k) {
return;
}
if (temp.size() == k) {
if (sum == n) {
res.push_back(temp);
}
return;
}
for (int i = index; i <= 9; i++) {
temp.push_back(i);
sum += i;
backTrace(n, k, i + 1, sum);
temp.pop_back();
sum -= i;
}
};
backTrace(n, k, 1, 0);
return res;
}
};
Go
func combinationSum3(k int, n int) [][]int {
var res [][]int
var temp []int
var backTrace func(int, int, int, int)
backTrace = func(n, k, index, sum int) {
if sum > n {
return
}
if (9-index+1)+len(temp) < k {
return
}
if len(temp) == k {
if sum == n {
copyTemp := make([]int, len(temp))
copy(copyTemp, temp)
res = append(res, copyTemp)
}
return
}
for i := index; i <= 9; i++ {
temp = append(temp, i)
sum += i
backTrace(n, k, i+1, sum)
temp = temp[:len(temp)-1]
sum -= i
}
}
backTrace(n, k, 1, 0)
return res
}