1、题目
2、题解
看到题目的第一瞬间想到了回溯法,将整体看作树的结构,每一层的节点依次为candidates的各个元素,减去相加不等于target的树枝。递归很适合,有以下几点可以减少回溯的个数。
(1)将candidates升序排列。
(2)当已有各节点的和已经大于等于 target ,其后的所有树枝可以都直接剪掉。
代码如下
(注意:每次添加满足要求的组合时都要新建数组,否则会导致数值覆盖的情况出现,因为这个好几次提交都没通过,又是写出气死自己bug的一天)
var res [][]int
var can []int
var tar int
func combinationSum(candidates []int, target int) [][]int {
res = [][]int{}
can = candidates
sort.Ints(can)
tar = target
comine(0, 0, 0, []int{})
return res
}
func comine(now, level, index int, nowL []int) {
for i:=index; i<len(can); i++{
if now+can[i]<tar{
in := append(nowL, can[i])
comine(now+can[i], level+1, i, in)
}else if now+can[i]==tar{
nowL = append(nowL, can[i])
res = append(res, append([]int{}, nowL...))
break
}else{
break
}
}
}
提交结果如下