39题是组合数I,和这道题的区别是上一道题的数字是可以无限制重复使用的,这一题呢只能使用给出来的那些数字
那么我们的问题来了,要怎么样去排除我们的重复答案呢?
上一道题我们用大于等于back的数才能往下递归,这里除了这个以外,还需要注意的是,这里给出来的数字也可能重复,所以我们就需要在一层里面只用一次这个数字
class Solution {vector<vector<int>> res;vector<int> v;vector<int> candidates;void dfs(int remain, int idx){if(remain == 0){res.push_back(v);return;}if(idx == candidates.size() || remain < 0){return;}for(int i = idx; i < candidates.size(); i++){//在一层里面只用一次这个数字if(i > idx && candidates[i] == candidates[i - 1]) continue;v.push_back(candidates[i]);dfs(remain - candidates[i], i + 1);v.pop_back();}}public:vector<vector<int>> combinationSum2(vector<int>& _candidates, int target) {candidates = _candidates;sort(candidates.begin(), candidates.end());dfs(target, 0);return res;}};
第二次写题
class Solution {vector<vector<int>> res;vector<int> path;void dfs(vector<int> & candidates, int idx, int target){if(!target){res.push_back(path);return;}if(idx == candidates.size()) return;for(int i = idx; i < candidates.size(); i++){if(i > idx && candidates[i] == candidates[i - 1]) continue;if(candidates[i] <= target ){path.push_back(candidates[i]);dfs(candidates, i + 1, target - candidates[i]);path.pop_back();}}return;}public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());dfs(candidates, 0, target);return res;}};
第三次写题
如果和前面一个一样的话就跳过吧。
class Solution {vector<int> candidates;vector<vector<int>> res;vector<int> path;void dfs(int target, int idx){if(target == 0){res.push_back(path);return;}if(target < 0) return;for(int i = idx; i < candidates.size(); i++){if(candidates[i] > target) break;if(i > idx &&candidates[i] == candidates[i - 1]) continue;path.push_back(candidates[i]);dfs(target - candidates[i], i + 1);path.pop_back();}}public:vector<vector<int>> combinationSum2(vector<int>& _candidates, int target) {candidates = _candidates;sort(candidates.begin(), candidates.end());dfs(target, 0);return res;}};
