题目40:组合总和Ⅱ
题目描述:
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
题解:
这题与39题的区别在于如何去重,对candidates进行升序排序,相同的数必定相连,直接跳过就行
func combinationSum2(candidates []int, target int) [][]int {
res, r := [][]int{}, []int{}
if len(candidates)==0{
return res
}
sort.Ints(candidates)
helper(candidates, target, 0, r, &res)
return res
}
func helper(candidates []int, target int, n int, r []int, res *[][]int){
if target==0{
c := make([]int, len(r))
copy(c, r)
*res = append(*res, c)
return
}
for i:=n;i<len(candidates);i++{
if i>n&&candidates[i]==candidates[i-1]{
continue
}
if target >= candidates[i]{
r = append(r, candidates[i])
helper(candidates, target-candidates[i],i+1,r, res)
r = r[:len(r)-1]
}
}
}