leetcode-回溯-39
题面
官方题解
https://leetcode-cn.com/problems/combination-sum/solution/zu-he-zong-he-by-leetcode-solution/
重点
-
回溯算法,采用递归实现,基本思路如下:
-
回溯的时候有两个递归边界条件
- candidates遍历完成
- target==0
-
每次面临两种选择,可以跳过当前数,也可以选择当前数(前提是target-当前数>0),但是“跳过”必须在“选择“之前。
源代码(注释部分是重点内容)
class Solution
{
public:
void dfs(vector<vector<int> > &combinations,int index,int target,vector<int> &combination,vector<int>& candidates)
{
//有两个递归边界条件,一个是candidates遍历完成,一个是target==0
if(target==0)
{
combinations.push_back(combination);
return;
}
//下面if条件语句不能写成(index == candidates.size()-1),这种情况下恰好说明到达了最后一个数字,不能直接返回
if(index == candidates.size()){
return;
}
int temp = candidates[index];
//可以跳过当前数,也可以选择当前数(前提是target-temp>0)
//“跳过”必须在“选择之前”,不能用if-else语句,否则就会出错
dfs(combinations,index+1,target,combination,candidates);
if(target-temp>=0)
{
combination.push_back(temp);
dfs(combinations,index,target-temp,combination,candidates);
combination.pop_back();
//下面这一行语句不能写,否则就会重复枚举
//dfs(combinations,index+1,target,combination,candidates);
}
// else
// {
// dfs(combinations,index+1,target,combination,candidates);
// }
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
vector<vector<int> > combinations;
vector<int> combination;
dfs(combinations,0,target,combination,candidates);
return combinations;
}
};
浙公网安备 33010602011771号