📝Leetcode 216. 组合总和 III

137 阅读1分钟

题目🌵

📝Leetcode 216. 组合总和 III

✏️leetcode-cn.com/problems/co…


找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

解题思路💡

  • 递归+回溯

  • 回溯的本质就是穷举,我们这里可以抽象成一个n叉树

    • 回溯需要终止条件

    • 在当前题目中,当路径中的元素个数===数组元素个数,即为一组排列组合

      if (path.length === k) {//当数组元素===原来数组的个数,说明一种排列组合完成
          if(sum===n){ // 满足题意的存进结果
              res.push([...path])     
          }
          //递归终止
          return
      }
      
    • 定义used数组,为了保证当前的排列中用的元素唯一

var combinationSum3 = function (k, n) {
    const result = [], path = []

    backTracking(1, 0, k, n)

    function backTracking(startIndex, sum, limitLen) {
        if (sum > n)
            return
        if (path.length === limitLen) {
            if (sum === n) {
                result.push([...path])
            }
            return
        }
        for (let i = startIndex; i <= 9; i++) {
            path.push(i)
            sum += i
            backTracking(i + 1, sum, limitLen)
            sum -= i
            path.pop()
        }
    }
    return result
};

image-20220310233219636