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;
}
};