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]
    }
}
posted @ 2020-03-14 11:22  Cenyol  阅读(82)  评论(0)    收藏  举报