leetcode-39:组合总和

简介: leetcode-39:组合总和

题目

题目链接

给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。

candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。

对于给定的输入,保证和为 target 的唯一组合数少于 150 个。

示例 1:

输入: candidates = [2,3,6,7], target = 7
输出: [[7],[2,2,3]]

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

示例 4:

输入: candidates = [1], target = 1
输出: [[1]]

示例 5:

输入: candidates = [1], target = 2
输出: [[1,1]]

解题

方法一:回溯

由于每次要判断 和,所以传参要有sum

每次开始的索引,要从当前索引开始 ,所以要有startIndex ,不然的话, 比如 candidates=[2,3], target=7

但是输出的结果可能会是[[2,2,3],[2,3,2],[3,2,2]], 而期望结果是[[2,2,3]];

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracing(vector<int>& candidates,int target,int startIndex,int sum){
        if(sum==target){
            res.push_back(path);
            return;
        }
        else if(sum>target) return; //这个就是剪枝,不然还会进行下面的循环
        for(int i=startIndex;i<candidates.size();i++){
            path.push_back(candidates[i]);
            sum+=candidates[i];
            backtracing(candidates,target,i,sum);
            sum-=candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtracing(candidates,target,0,0);
        return res;
    }
};

java

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


相关文章
|
7月前
|
人工智能 BI 索引
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
25 0
|
4月前
|
存储 算法
算法题解-组合总和3
算法题解-组合总和3
|
4月前
|
Java
leetcode-216:组合总和 III
leetcode-216:组合总和 III
19 0
|
4月前
|
Java
leetcode-377:组合总和 Ⅳ
leetcode-377:组合总和 Ⅳ
16 0
|
4月前
|
Java
leetcode-40:组合总和 II
leetcode-40:组合总和 II
19 0
|
7月前
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
20 0
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #40 组合总和 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
leetcode:39.组合总和
给定一个无重复元素的数组 candidates和一个目标数 target,找出 candidates中所有可以使数字和为 target的组合。
43 0
|
11月前
leetcode:40.组合总和 II
给定一个数组 candidates和一个目标数 target,找出 candidates中所有可以使数字和为 target的组合。
37 0
力扣40. 组合总和 IIJava
力扣40. 组合总和 IIJava
42 0