018_组合总和
知识点:回溯(DFS)、以及对树结构理解(剪枝)
LeetCode第三十九提:https://leetcode-cn.com/problems/combination-sum/
i 每次从上一层的index开始,可以实现剪枝重复的元素,特别是无序的排列组合。如果是对相同元素,但是排序敏感的,就需要每次重0开始,否则从上次用过的元素之后开始,避免重复
语言:GoLang
// 回溯 + 剪枝:对于重复的答案直接过滤掉
var result [][]int
func combinationSum(candidates []int, target int) [][]int {
result = [][]int{}
sort.Ints(candidates)
backtrack(candidates, target, []int{}, 0)
return result
}
func backtrack(candidates []int, target int, track []int, index int) {
if target == 0 {
tmp := make([]int, len(track))
copy(tmp, track)
result = append(result, tmp)
return
}
// i 每次从上一层的index开始,可以实现剪枝重复的元素,特别是无序的排列组合
// 如果是对相同元素,但是排序敏感的,就需要每次重0开始,否则从上次用过的元素之后开始,避免重复
length := len(candidates)
for i := index; i < length; i++ {
// 也是个小剪枝,但需要事先排序
if target < candidates[i] {
return
}
track = append(track, candidates[i])
backtrack(candidates, target - candidates[i], track, i)
track = track[: len(track) - 1]
}
}