【 LeetCode 216】 组合总和 III (中等) dfs回溯

  1. 组合总和 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]]

代码:

class Solution {
    
    
public:
    vector<vector<int>> ans;
    vector<int> t;

    void dfs(int sum,int cnt,int k,int n)
    {
    
    
        if(sum>n || cnt>k) return; //剪枝

        if(sum==n && cnt==k) //和为n k个数 符合要求
        {
    
    
            ans.push_back(t);
            return;
        }

        for(int i=1;i<=9;i++)
        {
    
    
            if(!t.size() || t[t.size()-1]<i) //防止重复:后面数比前面大
            {
    
    
                t.push_back(i);
                dfs(sum+i,cnt+1,k,n);
                t.pop_back(); //回溯
            }
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
    
    
        dfs(0,0,k,n);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45260385/article/details/108528119