Combination Sum 思路
Combination Sum 思路
最新刷leetcode的题目,发现了Combination Sum题目,这个题目分为I、II、III。难度层层递进,题目就是遍历vector容器,选择出符合target number的sum组合,这个题目的思路可以参考DFS通用解法。我们使用那个DFS模板,首先要构造dfs函数。
一般情况下,我们需要五个参数:结果,原始数据集,中间结果,当前指向的数据,满足target number的值:
然后我们根据candidates中的数据集,深搜这个数据集的各种可能性,将达成target的path中间结果加入result,按照通用模版
void dfs(type &input, type &path, type &result, int cur or gap) {
if (数据非法) return 0; // 终止条件
if (cur == input.size()) { // 收敛条件
// if (gap == 0) {
将path 放入result
}
if (可以剪枝) return;
for(...) { // 执行所有可能的扩展动作
执行动作,修改path
dfs(input, step + 1 or gap--, result);
恢复path
}
}
第一步:收敛也就是target==0
第二步:使用for(),并在循环中剪枝 if(target-candidates[current]<0) return;
第三步:如果通过第二部,也就意味着这个current合格,可以将这个加入到path中,然后继续深度遍历。dfs(result,candidates,path,current,target-candidates[current]);这里的问题是candidates的数据是可重复的,可以多次使用。如果只使用一次的话,也就意味着我们需要sort(),然后需要将上个满足条件的值跳过,也就是II中的nums[i]==nums[i-1]比较(Combination Sum II)
void dfs(vector < vector< int> > &result,vector& candidates,vector path,int current,int target){
if(!path.empty()&&target==0){
result.push_back(path);
return;
}
if(current<candidates.size()){
int tmp = -1;//start from 0 and 1
for(;current<candidates.size();current++){
if(candidates[current]==tmp)
continue;
if(target-candidates[current]<0)
return;
tmp = candidates[current];
path.push_back(candidates[current]);
dfs(result,candidates,path,current+1,target-candidates[current]);
path.pop_back();
}
}
}
</code></pre>
##题目:
[https://leetcode.com/problems/combination-sum/](https://leetcode.com/problems/combination-sum/)
[https://leetcode.com/problems/combination-sum/](https://leetcode.com/problems/combination-sum/)
[https://leetcode.com/problems/combination-sum-iii/](https://leetcode.com/problems/combination-sum-iii/)