链接:https://leetcode-cn.com/problems/combination-sum-ii/
这道题和全排列II类似,都是有重复元素的回溯题。比如原数组为
[
1
,
1
,
6
,
7
]
[1,1,6,7]
[1,1,6,7],目标数为8,我们要保证结果中只有一个
[
1
,
7
]
[1,7]
[1,7]且含有数组
[
1
,
1
,
6
]
[1,1,6]
[1,1,6]。因此不能简单地跳过重复元素。使用一个标志数组来表示重复元素的使用情况,若为1则表示此元素已被选中,并且进入了下一层递归,此时我们可以选用与它重复的元素(保证
[
1
,
1
,
6
]
[1,1,6]
[1,1,6]在结果中);若为0则表示以此元素为“头部”的递归已结束,不能选用与它重复的元素来递归(保证只有一个
[
1
,
7
]
[1,7]
[1,7])。
C++代码:
class Solution {
public:
vector<vector<int>> res;
vector<int> sign;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
for(int i = 0;i<candidates.size();i++)
sign.push_back(0);
sort(candidates.begin(),candidates.end());
vector<int>curr;
backtrack(candidates,0,target,curr,0);
return res;
}
void backtrack(vector<int>& candidates, int begin, int target,vector<int> curr, int sum)
{
if(sum == target)
{
res.push_back(curr);
return;
}
for(int i = begin;i<candidates.size();i++)
{
if(candidates[i]+sum>target)
break;
if(i>0&&candidates[i] == candidates[i-1] && sign[i-1] == 0)
continue;
curr.push_back(candidates[i]);
sign[i] = 1;
backtrack(candidates,i+1,target,curr,sum+candidates[i]);
sign[i] =0;
curr.pop_back();
}
}
};

这篇博客讨论了如何利用回溯算法解决组合求和问题,特别是在有重复元素的情况下。作者通过C++代码展示了如何维护一个标志数组来跟踪元素的使用情况,确保结果中正确处理重复元素,同时避免无效的递归路径。博客重点在于理解和实现回溯算法的细节,以及处理数组中重复元素的策略。
223

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



