39.go 948 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func combinationSumIter(candidates []int, target int, beg int, last []int, res *[][]int) {
  7. if target == 0 {
  8. *res = append(*res, last)
  9. }
  10. for i := beg; i < len(candidates) && candidates[i] <= target; i++ {
  11. // if don't copy solution, iteration'll fail
  12. // go slice is just like a ptr
  13. solution := make([]int, len(last))
  14. copy(solution, last)
  15. solution = append(solution, candidates[i])
  16. combinationSumIter(candidates, target-candidates[i], i, solution, res)
  17. }
  18. }
  19. func combinationSum(candidates []int, target int) [][]int {
  20. res := make([][]int, 0)
  21. sort.Ints(candidates)
  22. combinationSumIter(candidates, target, 0, []int{}, &res)
  23. return res
  24. }
  25. func main() {
  26. a1 := []int{2, 3, 6, 7}
  27. fmt.Println(combinationSum(a1, 7))
  28. a2 := []int{1, 2}
  29. fmt.Println(combinationSum(a2, 4))
  30. a3 := []int{8, 7, 4, 3}
  31. fmt.Println(combinationSum(a3, 11))
  32. a4 := []int{7, 3, 2}
  33. fmt.Println(combinationSum(a4, 18))
  34. }