leetcode-216:组合总和 III

简介: leetcode-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]]

解题

参考链接

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracing(int k,int n,int sum,int startIndex){
        if(path.size()==k){
            if(sum==n) res.push_back(path);
            return;
        }
        for(int i=startIndex;i<=9;i++){
            path.push_back(i);
            sum+=i;
            backtracing(k,n,sum,i+1);
            sum-=i;
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracing(k,n,0,1);
        return res;
    }
};

剪枝

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracing(int k,int n,int sum,int startIndex){
        if(path.size()==k){
            if(sum==n) res.push_back(path);
            return;
        }
        for(int i=startIndex;i<=9-(k-path.size())+1;i++){//剪枝
            path.push_back(i);
            sum+=i;
      //剪枝
            if(sum>n){
                sum-=i;
                path.pop_back();
                return;
            }
            backtracing(k,n,sum,i+1);
            sum-=i;
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracing(k,n,0,1);
        return res;
    }
};

java

class Solution {
    List<List<Integer>> res=new LinkedList<>();
    List<Integer> path=new LinkedList<>();
    void dfs(int startIndex,int sum,int k,int target){
        if(path.size()==k){
            if(sum==target){
                res.add(new LinkedList<Integer>(path));
            }
            return;
        }else if(sum>target) return;
        for(int i=startIndex;i<=9;i++){
            path.add(i);
            dfs(i+1,sum+i,k,target);
            path.remove(path.size()-1);
        }
    }
    public List<List<Integer>> combinationSum3(int k, int n) {
        dfs(1,0,k,n);
        return res;
    }
}


相关文章
|
2月前
Leetcode第40题(组合总和2)
LeetCode第40题“组合总和II”的解题方法,使用了回溯法来找出所有可能的组合,并对重复元素进行了处理。
27 0
|
2月前
【LeetCode 51】216.组合总和III
【LeetCode 51】216.组合总和III
12 1
|
2月前
【LeetCode 53】39.组合总和
【LeetCode 53】39.组合总和
40 0
|
2月前
LeetCode第39题(组合总和)
LeetCode第39题要求找出一个无重复元素整数数组中所有和为给定目标数的不同组合,可以使用回溯法解决。
54 0
|
4月前
|
算法
LeetCode第40题组合总和II
LeetCode第40题"组合总和II"的解题策略,涉及排序、去重和使用标记数组避免重复组合,通过回溯法实现递归组合。
LeetCode第40题组合总和II
|
4月前
|
算法
LeetCode第39题组合总和
LeetCode第39题"组合总和"的解题思路和技巧,采用回溯法通过递归代替多层嵌套循环,有效解决组合问题。
LeetCode第39题组合总和
|
7月前
|
Java
leetcode-377:组合总和 Ⅳ
leetcode-377:组合总和 Ⅳ
42 0
|
7月前
|
Java
leetcode-40:组合总和 II
leetcode-40:组合总和 II
51 0
|
7月前
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
44 0
|
机器学习/深度学习 算法 安全
LeetCode - #40 组合总和 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。