LeetCode 40 Combination Sum II
思路
此题与Combination Sum的不同之处在于,此题中,每个元素只能用一次。而原题中,每个元素可以用多次。因此在原题中递归调用时,表示位置的参数为i,combination(rs, candidates, com, target - candidates[i], i)。在本题中,由于每个元素只能用一次,因此,最后一个参数使用i+1,下次递归从当前元素的下一个元素开始扫描,combination(rs, candidates, com, target - candidates[i], i + 1)。内部循环将重复的元素跳过。
代码
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>> rs;
vector<int> com;
combination(rs, candidates, com, target, 0);
return rs;
}
void combination(vector<vector<int>> &rs, vector<int> &candidates, vector<int> &com, int target, int cur) {
if (!target) {
rs.push_back(com);
return ;
}
for (int i = cur; i < candidates.size() && candidates[i] <= target; ++i) {
com.push_back(candidates[i]);
combination(rs, candidates, com, target - candidates[i], i + 1);
com.pop_back();
while (i + 1 < candidates.size() && candidates[i+1] == candidates[i]) ++i;
}
}
};