Skip to content

代码随想录 回溯算法:组合总和III

题目分类

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

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

思考

等同于找出1-9的k个数的组合总和为n的组合。在组合 的问题上加上了和为n的约束条件。所以终止条件不止判断path长度,还要判断path中元素和

回溯法三部曲
  • 回溯函数参数及返回值

    n k startIndex sum

  • 终止条件

    path长度达到k,终止,如果同时sum = tarSum,则path加入result,否则不加入

  • 回溯搜索的遍历过程

    for循环遍历从startIndex到n - (k - path.size()) +1,每次循环都计算累计和并将节点i加入path,递归进入,回溯撤回选择。这一步是做了剪枝,组合问题的通用剪枝操作

代码实现

C++
class Solution {
public:
    std::vector<std::vector<int>> result;
    std::vector<int> path;
    void backtracking(int targetSum, int k, int sum, int startIndex) {
        if (path.size() == k) {
            if (sum == targetSum) {
                result.push_back(path);
            }
            return;
        }
        for (int i = startIndex; i <= n - (k - path.size())+1; i++) {
            sum += i;
            path.push_back(i);
            backtracking(targetSum, k, sum, i + 1);
            sum -= i;
            path.pop_back();
        }
    }

    std::vector<std::vector<int>> combinationSum3(int k, int n) {
        backtracking(n, k, 0, 1);
        return result;
    }
};