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 sums to target.
Each number in candidates may only be used once in the combination.
Note:
 All numbers (including target) will be positive integers. The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
 A solution set is:
 [
 ⁠ [1, 7],
 ⁠ [1, 2, 5],
 ⁠ [2, 6],
 ⁠ [1, 1, 6]
 ]
 
 Example 2:
 Input: candidates = [2,5,2,1,2], target = 5,
 A solution set is:
 [
 [1,2,2],
 [5]
 ]
 
题目大意:
数组中有重复的数字,每个数字只能被使用一次,找出等于目标数字的排列组合。
 
解法:
这道题基于上面一道题稍微变了一点点,每个数字只能使用一次。基于上面一道题,就是将递归调用那一行
combinationCore(candidates,i+1,tmpSum,target,tmp,res);中的i变成了i+1
并且添加了if(i>index && candidates[i]== candidates[i-1]) continue,如果说数组中有重复的值则跳过这个值。
C++:
class Solution {
private:
    void combinationCore(vector<int>candidates,int index,int tmpSum,int target,vector<int>&tmp,vector<vector<int>>&res){
        if(tmpSum>target) return;
        if(tmpSum==target) {
            res.push_back(tmp);
            return;
        }
        for(int i=index;i<candidates.size();i++){
            if(i>index && candidates[i]== candidates[i-1]) continue;
            tmpSum+=candidates[i];
            tmp.push_back(candidates[i]);
            combinationCore(candidates,i+1,tmpSum,target,tmp,res);
            tmpSum-=candidates[i];
            tmp.pop_back();
        }
    }

public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<vector<int>>res;
        vector<int>tmp;
        combinationCore(candidates,0,0,target,tmp,res);

        return res;
    }
};

 Python:

class Solution(object):
    def combinationCore(self,nums,index,tmp,target,res):
        if target<0:
            return
        if not target:
            res.append(tmp)
            return
        for i in range(index,len(nums)):
            if i>index and nums[i]==nums[i-1]:
                continue
            self.combinationCore(nums,i+1,tmp+[nums[i]],target-nums[i],res)
        


    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates.sort()
        res=[]
        self.combinationCore(candidates,0,[],target,res)

        return res

  

posted @ 2019-03-25 17:53  小白兔云  阅读(149)  评论(0)    收藏  举报