216. 组合总和 III(回溯)

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

分析:

回溯,着重是backtracking中的写法,for(int i = startIndex; i <= 9; i++)循环中模拟了一个树的向下递归和向上回溯的过程,以递归调用为分界线,上面的代码为从上至下,下面的代码为从下至上,代码如下:

class Solution {
    
    
private:
    vector<vector<int>>  result;
    vector<int> path;
    void backtracking(int k, int n, int sum, int startIndex){
    
    
        if(sum > n) return; // 剪枝
        if(path.size() == k){
    
    
            if(sum == n){
    
    
                result.push_back(path);
                return;
            }
        }
        for(int i = startIndex; i <= 9; i++){
    
    
            sum += i; // 处理累加
            path.push_back(i); // 处理
            backtracking(k, n, sum, i + 1); // 递归
            // 一旦完成了递归的调用就准备向上回溯
            sum -= i; // 回溯
            path.pop_back(); // 回溯
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
    
    
        backtracking(k, n, 0, 1);
        return result;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34612223/article/details/113832447