0%

216.组合总和III

216.组合总和 III

题目描述:

找出所有相加之和为 $ n $ 的 $ k $ 个数的组合,且满足

  • 只使用数字 $ 1 $ 到 $ 9 $
  • 每个数字最多使用一次

返回所有可能的有效组合列表,不能包含相同的组合两次。

数据范围:
$ 2\le k \le 9, 1\le n \le 60 $

题解:

可以直接 dfs 深度为 $ k $ ,如果 step>k 直接返回,如果当前解的数量小于 $ k $ 也直接返回。注意使用 mask 打标记。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const static int INF = 0x3f3f3f3f;
vector<vector<int>> ans;
void dfs(int mask, int step, int start, int k, int sum, int n, vector<int> &cur)
{
if(cur.size() > k) return;
if (sum == n && cur.size() == k)
{
ans.emplace_back(cur);
return;
}
if (step >= k)
{
return;
}
for (int i = start; i <= 9; ++i)
{
if (mask & (1 << i))
continue;
cur.emplace_back(i);
dfs(mask | (1 << i), step + 1, i + 1, k, sum + i, n, cur);
cur.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n)
{
vector<int> cur;
int mask = 0;
dfs(mask, 0, 1, k, 0, n, cur);
return ans;
}
};