package main
import (
"fmt"
"sort"
)
//给你一个 无重复元素 的整数数组 candidates
//和一个目标整数 target ,找出 candidates
//中可以使数字和为目标数 target 的 所有 不同组合
//并以列表形式返回。你可以按 任意顺序 返回这些组合。
//candidates 中的 同一个 数字可以 无限制重复被选取 。
//如果至少一个数字的被选数量不同,则两种组合是不同的。
//对于给定的输入,保证和为 target 的不同组合数少于 150 个。
//示例 1:
//输入:candidates = [2,3,6,7], target = 7
//输出:[[2,2,3],[7]]
//解释:
//2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
//7 也是一个候选, 7 = 7 。
//仅有这两种组合。
// 回溯法
func main() {
candidates := []int{2, 3, 6, 7}
target := 9
fmt.Println("combination sum:", combinationSum(candidates, target))
fmt.Println("===")
// combination sum: [[2 2 2 3] [2 7] [3 3 3] [3 6]]
}
func combinationSum(candidates []int, target int) [][]int {
// 初始化路径 结果 以及递归函数
var result [][]int
var path []int
var backtrack func(start int, target int)
backtrack = func(start int, target int) {
if target == 0 {
// 找到一个解,复制当前路径到结果中
result = append(result, append([]int(nil), path...))
return
}
for i := start; i < len(candidates); i++ {
if candidates[i] > target {
// 当前数字大于剩余目标值,停止搜索
break
}
// 选择当前数字
path = append(path, candidates[i])
// 递归搜索剩余目标值
backtrack(i, target-candidates[i])
// 回溯,撤销选择
path = path[:len(path)-1]
}
}
// 排序并去重,优化搜索过程
candidates = removeDuplicates(candidates)
sort.Ints(candidates)
backtrack(0, target)
return result
}
func removeDuplicates(candidates []int) []int {
if len(candidates) <= 1 {
return candidates
}
result := make([]int, 1)
result[0] = candidates[0]
for _, num := range candidates[1:] {
if num != result[len(result)-1] {
result = append(result, num)
}
}
return result
}
leetcode39题 组合求和 golang
最新推荐文章于 2025-05-23 20:16:46 发布