LC40. 组合总和 II
解题思路
这题与组合总和(LC39)的区别在于给的candidates中有重复的元素,题目要求每个数字在一个组合中只能使用一次,那么这里有两种方法,第一种就是直接使用哈希表记录元素,第二种则比较简单,使用startIndex,由于candidates在开始已经被排序了,那么只要
i > startIndex 且 nums[i] == nums[i - 1]时可以直接continue避免使用重复元素
代码
Python
1 | class Solution: |
C++
1 | class Solution { |
Go
var (
answer [][]int
temp []int
)
func combinationSum2(candidates []int, target int) [][]int {
answer = [][]int{}
temp = []int{}
sort.Ints(candidates)
backtracking(candidates, target, 0, 0)
return answer
}
func backtracking(candidates []int, target int, start int, sum int) {
if sum == target {
t := make([]int, len(temp))
copy(t, temp)
answer = append(answer, t)
return
}
for i := start; i < len(candidates) && sum + candidates[i] <= target; i++ {
if i > start && candidates[i] == candidates[i - 1] {continue}
temp = append(temp, candidates[i])
backtracking(candidates, target, i + 1, sum + candidates[i])
temp = temp[:len(temp) - 1]
}
}
评论
