给定一个可能有重复数字的整数数组 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 中。
以下是代码的详细解释:
- 首先,sort 函数用于对候选项进行排序,以便在后续遍历中快速定位。
- 接着,dfs 方法接受当前子集的迭代器 begin、end 和目标值 target。该方法首先检查目标值是否为 0,如果是,则将当前子集添加到 ret 中并返回。否则,它使用 while 循环遍历当前子集,将满足条件的子集添加到当前子集数组中。这个过程中,upper_bound 和 lower_bound 函数用于查找满足条件的子集。
- 最后,combinationSum2 方法调用 dfs 方法并返回 ret。