xinyu04

导航

LeetCode 40 Combination Sum II 回溯

Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target.

Each number in candidates may only be used once in the combination.

Note: The solution set must not contain duplicate combinations.

Solution

去重的操作和之前的方法一样:对当前的候选答案 \(sort\) 以后,在 \(ans\) 里面查找。由于不能包含重复的答案,我们在将原数组 \(sort\) 以后,碰到的元素如果和之前一个相同,直接跳过 (\(continue\)

点击查看代码
class Solution {
private:
    vector<vector<int>> ans;
    vector<int> res;
    
    void dfs(vector<int> cd, int tgt, vector<int>& res, int pos){
        if(tgt==0){
            vector<int> tmp = res;
            sort(res.begin(), res.end());
            if(find(ans.begin(), ans.end(), res)==ans.end()){
                ans.push_back(res);
            }
            res=tmp;
            return;
        }
        for(int i=pos;i<cd.size();i++){
            if(i!=pos && cd[i]==cd[i-1])continue;
            if(tgt-cd[i]>=0){
                res.push_back(cd[i]);
                dfs(cd,tgt-cd[i], res, i+1);
                res.pop_back();
            }
        }
    }

public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        dfs(candidates, target, res, 0);
        return ans;
    }
};

posted on 2022-08-10 02:29  Blackzxy  阅读(12)  评论(0编辑  收藏  举报