给定一个候选数字的集合 candidates 和一个目标值 target. 找到 candidates 中所有的和为 target 的组合.
在同一个组合中, candidates 中的某个数字不限次数地出现.
样例
样例 1:
输入: candidates = [2, 3, 6, 7], target = 7
输出: [[7], [2, 2, 3]]
样例 2:
输入: candidates = [1], target = 3
输出: [[1, 1, 1]]
注意事项
所有数值 (包括 target ) 都是正整数.
返回的每一个组合内的数字必须是非降序的.
返回的所有组合之间可以是任意顺序.
解集不能包含重复的组合.
class Solution {
public:
/**
* @param candidates: A list of integers
* @param target: An integer
* @return: A list of lists of integers
*/
vector<vector<int>> combinationSum(vector<int> &candidates, int target) {
// write your code here
vector<vector<int>>result;
if(candidates.size()==0) return result;
vector<int> temp;
sort(candidates.begin(),candidates.end());
// set<vector<int>>judge;
// dfs(candidates,target,temp,result,0,judge,0);
dfs(candidates,target,temp,result,0);
return result;
}
/* void dfs(vector<int> &candidates, int target,vector<int>temp,vector<vector<int>>&result,int index,set<vector<int>>&judge,int sum)
{//优化前
if(sum>target) return;
else if(sum==target&&judge.count(temp)==0)
{
sort(temp.begin(),temp.end());
result.push_back(temp);
judge.insert(temp);
}
else
{
for (int i = index; i < candidates.size(); i++) {
sum+=candidates[i];
temp.push_back(candidates[i]);
dfs(candidates,target,temp,result,i,judge,sum);
sum-=candidates[i];
temp.pop_back();
}
}
}*/
void dfs(vector<int> &candidates, int target,vector<int>&temp,vector<vector<int>>&result,int index)
{//优化后版本
if(target<0) return;
else if(target==0)
{
result.push_back(temp);
}
else
{
for (int i = index; i < candidates.size(); i++) {
/* code */
if(i!=0&&candidates[i]==candidates[i-1])continue;
target-=candidates[i];
temp.push_back(candidates[i]);
dfs(candidates,target,temp,result,i);
target+=candidates[i];
temp.pop_back();
}
}
}
};