主要用到了深度优先搜索(DFS)的思想,需要注意的是在搜索的过程中对已经达到的点不做标记,因为我们的题目中允许数字重复。从当前节点开始DFS(包含当前节点)。
代码如下:执行用时12ms
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
//用DFS的思路求解
vector<vector<int>> result;
vector<int> temp;
dfs(candidates,result,temp,0,target);
return result;
}
void dfs(const vector<int>& candidates,vector<vector<int>>&result,vector<int>& temp,int begin,int target)
{
if(target==0){
result.push_back(temp); //满足条件,添加向量
return;
}
if(target<0){
return; //值太大了,返回从头开始(下次的头节点是当前头节点向前递增一位)
}
for(int i=begin;i<candidates.size();i++)
{//目标值大于0,说明还有空间
temp.push_back(candidates[i]);
dfs(candidates,result,temp,i,target-candidates[i]);
temp.pop_back();
}
}
};