申明:本文只用做自己的学习记录
题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
代码
func combinationSum(candidates []int, target int) [][]int {
result := [][]int{}
if len(candidates) == 0 {
return result
}
//初始化相关变量
temp := []int{} //中间变量用于次存放暂时结果
start := 0
//回溯函数
BackTrack(start, temp, target, candidates, &result)
return result
}
func BackTrack(start int, temp []int, target int, candidates []int, result *[][]int) {
//设置回溯算法结束条件
//当target==0说明刚好给出的列表里的存在元素相加等于target
//由于go语言节省空间的特性,需要另外开辟内存空间存储数据
if target < 0 {
return
} else if target == 0 {
current := make([]int, len(temp))
copy(current, temp)
*result = append(*result, current)
}
//进行主体循环
for i := start; i < len(candidates); i++ {
//add
temp = append(temp, candidates[i])
//回溯函数
BackTrack(i, temp, target-candidates[i], candidates, result)
//回溯
temp = temp[:len(temp)-1]
}
}