Leetcode第40题(组合总和2)

简介: LeetCode第40题“组合总和II”的解题方法,使用了回溯法来找出所有可能的组合,并对重复元素进行了处理。

题目描述:

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:[[1,1,6],[1,2,5],[1,7],[2,6]]
示例 2:

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

class Solution {
    vector<vector<int>> ans;
    vector<int> combine;
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0);
        return ans;
    }

    void dfs(vector<int>& candidates,int target,int idx){
        //target == 0
        if(target == 0){
            ans.push_back(combine);
            return;
        }
        //idx == candidates.size()
        if(idx == candidates.size()) return;

        //统计相同元素的个数
        int cnt = 1;
        while(idx + 1 < candidates.size() && candidates[idx] == candidates[idx + 1]){
            cnt++;
            idx++;
        }
        //避免重复
        for(int i = 0;i <= cnt && target >= i * candidates[idx];i++){
            dfs(candidates,target - i * candidates[idx],idx + 1);
            combine.push_back(candidates[idx]);
        }
        for(int i = 0;i <= cnt && target >= i * candidates[idx];i++)
            combine.pop_back();
    }
};
相关文章
|
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-40:组合总和 II
leetcode-40:组合总和 II
51 0
|
7月前
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
44 0
|
7月前
|
Java
leetcode-377:组合总和 Ⅳ
leetcode-377:组合总和 Ⅳ
42 0
|
7月前
|
Java
leetcode-216:组合总和 III
leetcode-216:组合总和 III
38 0
|
机器学习/深度学习 算法 安全
LeetCode - #40 组合总和 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。