40.组合数Ⅱ

在这里插入图片描述

错误代码:ans没有去重
结果中会出现,2,5和5,2这种情况

 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<vector<int>> ans;
        vector<int>tep;
        dfs(ans,candidates,target,0,0,tep);
        return ans;
    }
    void dfs(vector<vector<int>>& ans,vector<int>& candidates,int target,int sum,int index,vector<int> tep){
        if(sum==target){
            ans.push_back(tep);
            return;
        }
        if(sum>target) return;

        for(int i=index;i<candidates.size();i++){
            tep.push_back(candidates[i]);
            dfs(ans,candidates,target,sum+candidates[i],i+1,tep);
            tep.pop_back();
        }
    }

先sort一下,保证结果中的数字都是有序的,再用set判重。但用时较多。

 set<vector<int> > flag;
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<vector<int>> ans;
        vector<int>tep;
        sort(candidates.begin(),candidates.end());
        dfs(ans,candidates,target,0,0,tep);
        return ans;
    }
    void dfs(vector<vector<int>>& ans,vector<int>& candidates,int target,int sum,int index,vector<int> tep){
        if(sum==target){
            if(flag.count(tep)==0){
                ans.push_back(tep);
                flag.insert(tep);
            }
            return;
        }
        if(sum>target) return;

        for(int i=index;i<candidates.size();i++){
            tep.push_back(candidates[i]);
            dfs(ans,candidates,target,sum+candidates[i],i+1,tep);
            tep.pop_back();
        }
    }

sort一下之后,数组有序。
在这里插入图片描述

  • 但会出现这种情况。就是num[i]=num[i-1]的时候。
  • 我们的index是循环的初始,保证了每次选元素都是它的下一次元素。
  • 在一个for循环里面,元素都是一层的。比如图中的1,1,2,5,6,他们就是一层的。他们的index是一样的。
  • 如果我们剪枝使用i>0&&num[i]==num[i-1],那么相同元素在不同的层上也会被剪掉。如
    【1,2,2】 target=5
    在这里插入图片描述
  • 避免这种情况,我们i>index&&num[i]==num[i-1]。一方面可以判断i>0,另一方面可以剪枝,
    i>index说明是在同一层上选元素(如在,1,1,2,5,6上选一个元素进行深入),那么在同一层上元素相同,我们就进行剪枝。
发布了161 篇原创文章 · 获赞 68 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/105093695