Leetcode 216. 组合总和 III
1 题目描述(Leetcode题目链接)
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
输入: k = 3, n = 7
输出: [[1,2,4]]
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
2 题解
可以使用标准的回溯模板来解决问题。
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
retv = []
def helper(stack, rest, i, k):
if k == 0 and rest == 0:
retv.append(stack)
return
if rest < 0 or k <= 0:
return
while i <= 9:
if i <= rest:
helper(stack + [i], rest - i, i + 1, k - 1)
i += 1
helper([], n, 1, k)
return retv
用python怎么写效率都不太高,靠前的代码也不行。贴个评论区里面一个用户的C++代码。
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int>tmp;
dfs(n, res, k, tmp, 0);
return res;
}
void dfs(int n, vector<vector<int>>& res, int k, vector<int>& tmp, int i)
{
if(n < 0) return;
if(k == 0)
{
if(n == 0) res.push_back(tmp);
return;
}
for(int j = i + 1; j <= 9; j++)
{
tmp.push_back(j);
dfs(n - j, res, k - 1, tmp, j);
tmp.pop_back();
}
return;
}
};