0
点赞
收藏
分享

微信扫一扫

LeetCode39-组合总和

大柚子top 2022-03-11 阅读 54

LeetCode39-组合总和

Leetcode / 力扣

39. 组合总和:

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

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

示例 3:

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

提示:

解题思路1:

class Solution {
    vector<vector<int> >ans;
    int len;
    void dfs(vector<int>& candidates,int loc,int cnt,int num,int target,vector<int>a) {
        for(int i=0;i<cnt;++i)
            a.push_back(num);
        if(target==0)
            ans.push_back(a);
        if(loc==len||target<=0)
            return ;
        int x=target/candidates[loc];
        for(int i=x;i>=0;--i)      //选取当前数多次
            dfs(candidates,loc+1,i,candidates[loc],target-i*candidates[loc],a);
    }

public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        ans.clear();
        len=candidates.size();
        vector<int>a;
        dfs(candidates,0,0,0,target,a);
        return ans;
    }
};

解题思路2:

class Solution {
    vector<vector<int> >ans;
    int len;
    void dfs(vector<int>& candidates,int loc,int target,vector<int>a) {
        if(target==0)
            ans.push_back(a);
        if(loc==len||target<=0)
            return ;
        dfs(candidates,loc+1,target,a); //不选当前
        a.push_back(candidates[loc]);
        dfs(candidates,loc,target-candidates[loc],a);   //选择当前一个
        a.pop_back();
    }

public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        ans.clear();
        len=candidates.size();
        vector<int>a;
        dfs(candidates,0,target,a);
        return ans;
    }
};
举报

相关推荐

0 条评论