目录
问题描述
我们需要找出所有由 k
个不同数字组成的组合,这些数字的范围是 1 到 9,且它们的和等于 n
。组合中的数字不能重复使用,且结果不能包含重复的组合。例如,当 k=3, n=7
时,唯一有效的组合是 [1,2,4]
。
解决思路
这个问题可以通过回溯算法解决。核心思想是递归地尝试每一个可能的数字,逐步构建符合条件的组合,并通过剪枝优化减少无效搜索。
关键点
-
数字范围固定:所有数字只能在
1-9
中选择。 -
组合唯一性:每个组合中的数字必须严格递增,避免重复(如
[1,2,4]
和[2,1,4]
被视为同一组合)。 -
剪枝优化:在递归过程中,提前终止不可能满足条件的分支,大幅提高效率。
代码实现
var combinationSum3 = function (k, n) {
const result = [];
const path = [];
const dfs = (start, sum) => {
// 终止条件:路径长度等于k且和等于n
if (path.length === k && sum === n) {
result.push([...path]);
return;
}
// 遍历候选数字
for (let i = start; i <= 9; i++) {
// 剪枝1:剩余数字不够组成k个数
if (path.length + (9 - i + 1) < k) break;
// 剪枝2:当前和超过n
if (sum + i > n) break;
path.push(i);
dfs(i + 1, sum + i); // 递归下一层,起始位置为i+1
path.pop(); // 回溯,撤销选择
}
};
dfs(1, 0); // 从数字1开始,初始和为0
return result;
};
代码解析
1. 初始化结果和路径
-
result
:存储所有符合条件的组合。 -
path
:记录当前递归路径中的数字。
2. 深度优先搜索(DFS)
-
参数:
start
表示当前递归的起始数字,