39. Combination Sum
- Total Accepted: 124666
- Total Submissions: 357084
- Difficulty: Medium
- Contributors: Admin
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3] ]
解题思路:
本题可采用深度优先搜索的方法,遍历每一种可行解,具体参见代码注释。
代码展示:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int csize= candidates.size();
sort(candidates.begin(),candidates.end());
sol=candidates;
vector<int> tmp;
dfs(tmp,target,0);
return res;
}
private:
vector<vector<int> > res;
vector<int> sol;
int sum(vector<int> tmp)
{
int n = tmp.size();
int tmp_sum=0;
for(int i=0;i<n;i++)
{
tmp_sum+=tmp[i];
}
return tmp_sum;
}
void dfs(vector<int> &tmp,int target, int l)
{
if(l==sol.size()) return;//l==size时,所有情况都遍历过
int tmp_tot = sum(tmp); //计算tmp的和,如果大于target则剪枝,等于target则为一合法解,小于target继续添加数
if(tmp_tot>target) return ;
else if(tmp_tot==target)
{
res.push_back(tmp);
return ;
}
else
{
for(int i=l;i<sol.size();i++)
{
tmp.push_back(sol[i]);//添加数sol[i]
dfs(tmp,target,i);
tmp.pop_back();//回溯,删除数sol[i]
}
}
}
};