18.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func threeSum(nums []int, target int) [][]int {
  7. if len(nums) < 3 {
  8. return [][]int{}
  9. }
  10. sort.Ints(nums)
  11. res := make([][]int, 0)
  12. for a := 0; a < len(nums)-2; a++ {
  13. if a > 0 && nums[a] == nums[a-1] {
  14. continue
  15. }
  16. // the same as twoSum: target -> -nums[a], nums -> nums[a+1:]
  17. // one or more or none solutions
  18. b, c := a+1, len(nums)-1
  19. for b < c {
  20. nb, nc := nums[b], nums[c]
  21. sum := nums[a] + nb + nc
  22. if sum < target {
  23. b++
  24. } else if sum > target {
  25. c--
  26. } else {
  27. res = append(res, []int{nums[a], nb, nc})
  28. for ; b < c && nums[b] == nb; b++ {
  29. }
  30. for ; b < c && nums[c] == nc; c-- {
  31. }
  32. }
  33. }
  34. }
  35. return res
  36. }
  37. func fourSum(nums []int, target int) [][]int {
  38. sort.Ints(nums)
  39. res := make([][]int, 0)
  40. for i := 0; i < len(nums)-3; i++ {
  41. if i > 0 && nums[i] == nums[i-1] {
  42. continue
  43. }
  44. tmp := threeSum(nums[i+1:], target-nums[i])
  45. for _, v := range tmp {
  46. res = append(res, append([]int{nums[i]}, v...))
  47. }
  48. }
  49. return res
  50. }
  51. func main() {
  52. a1 := []int{1, 0, -1, 0, -2, 2}
  53. fmt.Println(fourSum(a1, 0))
  54. }