题目描述
找出所有相加之和为 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]]
思路
DFS + 剪枝
- 两个条件都满足才加入结果集,如果只满足其中一个就直接返回。(剪枝)
- 用当前下标表示从1~9来选,不需要另外的判重数组,下标控制循环保证不会重复。
代码
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
dfs(k, n, 0, 0, 1);
return res;
}
public void dfs(int k, int n, int sum, int cnt, int idx) {
//总和为n,并且数的个数为n时
if (cnt == k && sum == n) {
res.add(new ArrayList<>(path));
}
//如果只满足其中一个条件,就返回
if (cnt == k || sum == n) return;
//开始枚举1~9,用idx来控制循环保证不重复
for (int i = idx; i <= 9; i ++ ) {
//i既是下标,也作为值
path.add(i);
dfs(k, n, sum + i, cnt + 1, i + 1);
path.remove(path.size() - 1);
}
}
}
该博客探讨了如何使用深度优先搜索(DFS)和剪枝策略来解决LeetCode上的216题——组合总和III。问题要求找到所有和为n的正整数k个数的组合,限制数字范围为1到9,并确保组合中没有重复数字。解题思路是利用DFS进行搜索,并在满足特定条件下才将结果添加到集合中,以避免无效的路径和重复的组合。
931

被折叠的 条评论
为什么被折叠?



