LeetCode 040 Combination Sum II

4415 ワード

タイトル要求:Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

  • For example, given candidate set  10,1,2,7,6,1,5  and target  8 , A solution set is:  [1, 7]   [1, 2, 5]   [2, 6]   [1, 1, 6]  
     
    分析:
    Combination Sumの中の要素は無限に使用できますが、Combination Sum IIは要素ごとに1回しか使用できません.
     
    コードは次のとおりです.
    class Solution {
    
    public:
    
        vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
    
            // Start typing your C/C++ solution below
    
            // DO NOT write int main() function
    
            sort(candidates.begin(), candidates.end());
    
            set<vector<int> > ans;
    
            vector<int> record;
    
            searchAns(ans, record, candidates, target, 0);
    
            
    
            vector<vector<int> > temp;
    
            for (set<vector<int> >::iterator it = ans.begin(); it != ans.end(); it++) {
    
                temp.push_back(*it);
    
            }
    
            return temp;
    
        }
    
        
    
    private:
    
        void searchAns(set<vector<int> > &ans, vector<int> &record, vector<int> &candidates, int target, int idx) {
    
            
    
            if (target == 0) {
    
                ans.insert(record);
    
                return;
    
            }
    
            
    
            if (idx == candidates.size() || candidates[idx] > target) {
    
                return;
    
            }
    
            
    
            for (int i = 1; i >= 0; i--) {
    
                record.push_back(candidates[idx]);            
    
            }
    
            
    
            for (int i = 1; i >= 0; i--) {
    
                record.pop_back();
    
                searchAns(ans, record, candidates, target - i * candidates[idx], idx + 1);
    
            }
    
        }
    
    };