|
@@ -0,0 +1,55 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import "fmt"
|
|
|
+
|
|
|
+func main() {
|
|
|
+ var nums []int
|
|
|
+ var target int
|
|
|
+
|
|
|
+ nums = []int{1, 2, 3, 4}
|
|
|
+ target = 3
|
|
|
+ fmt.Println(combinationSum(nums, target))
|
|
|
+
|
|
|
+ return
|
|
|
+ nums = []int{2, 3, 6, 7}
|
|
|
+ target = 7
|
|
|
+ fmt.Println(combinationSum(nums, target))
|
|
|
+
|
|
|
+ nums = []int{2, 3, 5}
|
|
|
+ target = 8
|
|
|
+ fmt.Println(combinationSum(nums, target))
|
|
|
+}
|
|
|
+
|
|
|
+func combinationSum(candidates []int, target int) [][]int {
|
|
|
+ var ret [][]int
|
|
|
+ var mark = map[int]bool{}
|
|
|
+ for i := 0; i < len(candidates); i++ {
|
|
|
+ findSubSet(candidates, candidates[i], target, &ret, mark)
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+}
|
|
|
+
|
|
|
+func findSubSet(nums []int, value, compare int, data *[][]int, mark map[int]bool) bool {
|
|
|
+ var ret = false
|
|
|
+ if value == compare {
|
|
|
+ *data = append(*data, []int{value})
|
|
|
+ ret = true
|
|
|
+ }
|
|
|
+ var distance = compare - value
|
|
|
+ fmt.Println(value, compare, distance, data)
|
|
|
+ for i := 0; i < len(nums) && nums[i] <= distance; i++ {
|
|
|
+ has := findSubSet(nums, nums[i], distance, data, mark)
|
|
|
+ fmt.Println(value, compare, distance, data, has, "----------------", mark)
|
|
|
+ if has {
|
|
|
+ ret = true
|
|
|
+ if _, ok := mark[nums[i]]; ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ mark[nums[i]] = true
|
|
|
+ for j := 0; j < len(*data); j++ {
|
|
|
+ (*data)[j] = append((*data)[j], nums[i])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+}
|