39.Combination Sum

25 年 7 月 29 日 星期二
498 字
3 分钟

39. Combination Sum

Screenshot 2026-03-08 at 11.38.57 am
js
/**
 * @param {number[]} candidates - 无重复元素的正整数数组
 * @param {number} target - 目标和
 * @return {number[][]} - 所有和为目标值的组合列表
 */
var combinationSum = function (candidates, target) {
  // 对应原Python的ans,存储最终结果
  let ans = []
  // 对应原Python的path,存储当前回溯路径
  let path = []

  /**
   * 深度优先搜索函数(对应原Python的dfs)
   * @param {number} i - 当前遍历到的候选数组下标(原Python的i)
   * @param {number} left - 距离目标值剩余的数值(原Python的left)
   */
  const dfs = (i, left) => {
    // 递归终止条件1:剩余值为0,找到合法组合
    if (left === 0) {
      // 拷贝当前路径加入结果(避免后续修改path影响结果)
      ans.push([...path])
      return
    }

    // 递归终止条件2:遍历完所有候选数 或 剩余值小于0(路径和超目标值)
    if (i === candidates.length || left < 0) {
      return
    }

    // 分支1:不选当前下标i的数,递归下一个下标
    dfs(i + 1, left)

    // 分支2:选择当前下标i的数
    // 将当前数加入路径
    path.push(candidates[i])
    // 递归(下标不变,可重复选当前数;剩余值减去当前数)
    dfs(i, left - candidates[i])
    // 回溯:恢复path状态,移除最后加入的数
    path.pop()
  }

  // 初始调用:从下标0、剩余值为target开始
  dfs(0, target)

  return ans
}

这个 dfs 函数是深度优先搜索(Depth-First Search) 的核心实现,它的作用是:从候选数组的第 i 个位置开始,在剩余可选的数字中,寻找所有能凑出剩余目标值 left 的组合,并把符合条件的组合存入最终结果 ans

函数的作用就是在候选数组中,只考虑下标 ≥ i 的元素,通过 “选当前 i 位置的数” 或 “不选当前 i 位置的数” 两种选择,递归寻找能凑出剩余值 left 的所有组合。

文章标题:39.Combination Sum

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/39combination_sum[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。