注意去重:本解法设置每一组解的元素按照递增的原则分布,从而去重
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;
}
};
组合求和算法解析
本文详细解析了两种解决组合求和问题的算法实现方案。通过递归的方式寻找所有可能的组合,确保每组解按递增顺序排列以避免重复。同时介绍了如何利用回溯法进行搜索,并展示了具体的代码实现细节。
1566

被折叠的 条评论
为什么被折叠?



