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