216. 组合总和 III 回溯

目录

问题描述

解决思路

关键点

代码实现

代码解析

1. 初始化结果和路径

2. 深度优先搜索(DFS)

3. 遍历候选数字

4. 递归与回溯

示例分析

复杂度与优化

回溯算法三部曲

1. 路径选择:记录当前路径

2. 递归探索:进入下一层决策

3. 撤销选择:回溯到上一层

 代码框架模板

关键点解析

总结


问题描述

我们需要找出所有由 k 个不同数字组成的组合,这些数字的范围是 1 到 9,且它们的和等于 n。组合中的数字不能重复使用,且结果不能包含重复的组合。例如,当 k=3, n=7 时,唯一有效的组合是 [1,2,4]

解决思路

这个问题可以通过回溯算法解决。核心思想是递归地尝试每一个可能的数字,逐步构建符合条件的组合,并通过剪枝优化减少无效搜索。

关键点
  1. 数字范围固定:所有数字只能在 1-9 中选择。

  2. 组合唯一性:每个组合中的数字必须严格递增,避免重复(如 [1,2,4] 和 [2,1,4] 被视为同一组合)。

  3. 剪枝优化:在递归过程中,提前终止不可能满足条件的分支,大幅提高效率。

代码实现

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 表示当前递归的起始数字,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 贾公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值