题意理解:
同39,但是,
1)要求同一元素不能重复使用;
2)输入元素中可能出现重复的内容,所以,剪枝过程要再39的基础上做调整;
解题代码:
class Solution {
private:
vector<vector<int>> ans;
void dfs(vector<int> candi, int index, vector<int> preAns, int tar){
int size=candi.size();
if(index>size){
return;
}
int pre=-1;
for(int i=index; i<size; i++){
if(candi[i]==pre){
continue;
}
vector<int> t(preAns);
t.push_back(candi[i]);
if(candi[i]<tar){
pre=candi[i];
dfs(candi, i+1, t, tar-candi[i]);
}else if(candi[i]>tar){
return;
}else{
ans.push_back(t);
return;
}
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<int> pre;
dfs(candidates, 0, pre, target);
return ans;
}
};
本文介绍了一个基于回溯算法解决组合求和问题的实现方案。该方案针对输入元素可能重复的情况进行了特殊处理,确保了结果中不会出现重复的组合。通过递归地遍历候选数并进行剪枝操作,有效避免了无效搜索。
1347

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



