含有重复元素集合的组合

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

candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。 

class Solution {
    vector<vector<int>> ret;
    vector<int> nums;
    void dfs(vector<int>::iterator begin, vector<int>::iterator end, int target) {
        if(0 == target) {
            ret.emplace_back(nums);
            return;
        }
        while(begin != (end = upper_bound(begin, end, target))) {
            nums.push_back(*(--end));
            dfs(begin, end, target - *end);
            nums.pop_back();
            end = lower_bound(begin, end, *end);  //unique
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        dfs(candidates.begin(), candidates.end(), target);
        return ret;
    }
};

解释:

这是一个 C++ 类,名为 Solution,它包含一个名为 combinationSum2 的公共方法,用于计算给定整数数组中所有子集的和等于给定目标值 target 的组合数。

Solution 类中有两个成员变量:

  • vector<vector<int>> ret:表示子集数组。这是因为这个方法可以产生不同的子集数组。
  • vector<int> nums:表示原始数组。这个变量可以在调用 combinationSum2 方法的时候使用。

该类还定义了一个名为 dfs 的公共方法,它接受三个参数:当前子集的迭代器 begin、end 和目标值 target。该方法的目的是找到满足条件的子集,并将其添加到当前子集数组中。如果目标值为 0,则直接将当前子集添加到 ret 中。

以下是代码的详细解释:

  1. 首先,sort 函数用于对候选项进行排序,以便在后续遍历中快速定位。
  2. 接着,dfs 方法接受当前子集的迭代器 begin、end 和目标值 target。该方法首先检查目标值是否为 0,如果是,则将当前子集添加到 ret 中并返回。否则,它使用 while 循环遍历当前子集,将满足条件的子集添加到当前子集数组中。这个过程中,upper_bound 和 lower_bound 函数用于查找满足条件的子集。
  3. 最后,combinationSum2 方法调用 dfs 方法并返回 ret。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值