注意去重:本解法设置每一组解的元素按照递增的原则分布,从而去重
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> nums;
find(candidates,nums,target);
return ans;
}
void find(vector<int>& candidates, vector<int> nums,int target)
{
if(target <= 0)
{
if(target == 0)
ans.push_back(nums);
return ;
}
for(int i=0;i<candidates.size();i++)
{
if(nums.size()==0||(nums.size()>0&&candidates[i]>=nums[nums.size()-1])) //消除重复,如[2,2,3]和[3,2,2]
{
nums.push_back(candidates[i]);
find(candidates,nums,target-candidates[i]);
nums.pop_back();
}
}
}
};
方法二:
class Solution {
public:
void find(vector<vector<int>>& ans, vector<int> nums, vector<int> flag, int tar, int begin)
{
if(!tar)
{
ans.push_back(flag);
return;
}
for(int i = begin;i<nums.size()&&tar>0;i++)
{
// if(flag.size()>1&&nums[i]==flag[flag.size()-1])
//continue;
// if(flag.size()==0||(flag.size()>0&&nums))
{
flag.push_back(nums[i]);
find(ans,nums,flag,-nums[i]+tar, i);
flag.pop_back();
}
}
return;
}
vector<vector<int>> combinationSum(vector<int>& nums, int target) {
vector<vector<int>> ans;
vector<int> flag;
find(ans, nums, flag, target, 0);
return ans;
}
};