首页 » 编程之美 » 正文

[leetcode_140]Combination Sum II

在数组中找寻一系列的数,之和为target。
搜索+剪枝。注意去重复和升序。

int cmp(int a,int b) {
    return a < b;
}
class Solution {
public:
    vector<vector<int>>ans;
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        ans.clear();
        sort(num.begin(),num.end(),cmp);
        vector<int> seq;
        seq.clear();
        addStep(num,0,0,target,seq);
        return ans;
    }
private:
    bool isSeqInAns(vector<int>&seq) {
        for(int i = 0;i < ans.size();i++) {
            if(ans[i] == seq)return false;
        }
        return true;
    }
    void addStep(vector<int> &num,int sum,int k,int target,vector<int>&seq) {
        if(sum == target) {
            if(isSeqInAns(seq))
                ans.push_back(seq);
            return;
        }
        if(k >= num.size()) {
            return ;
        }
        if(sum + num[k] <= target) {
            seq.push_back(num[k]);
            addStep(num,sum+num[k],k+1,target,seq);
            seq.pop_back();
        }
        addStep(num,sum,k+1,target,seq);
    }
};

发表评论