利用递归进行
Combination Sum VS Combination Sum II 两题解法十分相似, 区别仅在于是否可以多次利用同一个元素
Combination Sum
代码
class Solution {
public:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > result;
int size = candidates.size();
if(size==0)
return result;
vector<int> tempResult;
sort(candidates.begin(), candidates.end());
combinationSumHelper(candidates, result, tempResult, 0, target, size);
return result;
}
void combinationSumHelper(vector<int> &candidates, vector<vector<int> > &result, vector<int> &tempResult, int start, int target, int size)
{
if(target<0)
{
return ;
}
if(target==0)
{
result.push_back(tempResult);
return ;
}
for(int i = start; i < size; ++i)
{
if(i>0&&candidates[i]==candidates[i-1])
continue;
tempResult.push_back(candidates[i]);
combinationSumHelper(candidates, result, tempResult, i, target - candidates[i], size);
tempResult.pop_back();
}
return ;
}
};
Combination Sum II
Combination Sum II 需要注意的是为了避免出现相同的结果,需要在 combinationSumHelper函数的循环中添加 if 判断,此处的 if 判断虽然与 Combination Sum 相同,但是意义不同。
在这里我们还是需要在每一次for循环前做一次判断,因为虽然一个元素不可以重复使用,但是如果这个元素重复出现是允许的,但是为了避免出现重复的结果集,我们只对于第一次得到这个数进行递归,接下来就跳过这个元素了,因为接下来的情况会在上一层的递归函数被考虑到,这样就可以避免重复元素的出现。这个问题可能会觉得比较绕,大家仔细想想就明白了哈。(此处解释转自http://blog.youkuaiyun.com/linhuanmars/article/details/20829099)
class Solution {
public:
vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
vector<vector<int> > result;
int size = candidates.size();
if(size==0)
return result;
vector<int> tempResult;
sort(candidates.begin(), candidates.end());
combinationSumHelper(candidates, result, tempResult, 0, target, size);
return result;
}
void combinationSumHelper(vector<int> &candidates, vector<vector<int> > &result, vector<int> &tempResult, int start, int target, int size)
{
if(target==0)
{
result.push_back(tempResult);
return ;
}
if(target<0||start>=size)
{
return ;
}
for(int i = start; i < size; ++i)
{
if(i>start&&candidates[i]==candidates[i-1])
continue;
tempResult.push_back(candidates[i]);
combinationSumHelper(candidates, result, tempResult, i+1, target - candidates[i], size);
tempResult.pop_back();
}
return ;
}
};