回溯过程中降重剪枝


这题跟之前组合问题不同之处在于给的数组里面的元素是有重复的。
如果按照之前方法处理的话,就会得到重复的集合。
看了卡哥的方法,知道这个去重是是树层去重,横向的;不是树枝去重,纵向的。
这除了和前一个元素比较,还要加一个visit数组。如果前一个元素的visit是false就符合条件。
这个要记得在弹出元素的时候也有,将visit设置为false。

完整代码:

点击查看代码
class Solution {
public:
vector<int>v;
vector<vector<int>>cnt;
void backtracking(vector<int>& candidates, int target,int startflag,vector<bool>visited){
    int sum=0;
    int sz=v.size();
    for(int i=0;i<sz;i++){
        sum+=v[i];
    }
    if(sum>target){return ;}
    else if(sum==target){
    cnt.push_back(v);
        return ;
    }
    for(int i=startflag;i<candidates.size();i++){
        if(i>0&&candidates[i]==candidates[i-1]&&visited[i-1]==false){continue;}      
        v.push_back(candidates[i]);
        visited[i]=true;
        backtracking(candidates,target,i+1,visited);
        visited[i]=false;
        v.pop_back();
    }
}

    vector<vector<int>> combinationSum2(vector<int>&candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<bool>visited(candidates.size(),false);
backtracking(candidates,target,0,visited);
return cnt;
    }
};
posted @   yun-che  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示