main.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package main
  2. // 排序+双指针法
  3. import (
  4. "fmt"
  5. "sort"
  6. )
  7. func main() {
  8. var nums []int
  9. nums = []int{-1, 0, 1, 2, -1, -4}
  10. fmt.Println(threeSum(nums))
  11. nums = []int{3, 0, -2, -1, 1, 2}
  12. fmt.Println(threeSum(nums))
  13. }
  14. func threeSum(nums []int) [][]int {
  15. var ret = [][]int{}
  16. sort.Ints(nums)
  17. for i := 0; i < len(nums); i++ {
  18. if i > 0 && nums[i] == nums[i-1] {
  19. continue
  20. }
  21. var j, k = i + 1, len(nums) - 1
  22. for j < k {
  23. var num = nums[i] + nums[j] + nums[k]
  24. if num == 0 {
  25. ret = append(ret, []int{nums[i], nums[j], nums[k]})
  26. for j < k {
  27. j++
  28. if nums[j] != nums[j-1] {
  29. break
  30. }
  31. }
  32. for k > j {
  33. k--
  34. if nums[k] != nums[k+1] {
  35. break
  36. }
  37. }
  38. } else {
  39. if num > 0 {
  40. k--
  41. }
  42. if num < 0 {
  43. j++
  44. }
  45. // 添加了这里的优化,反而时间多了一点,但是内存少了许多
  46. //if num > 0 {
  47. // for k > j {
  48. // k--
  49. // if nums[k] != nums[k+1] {
  50. // break
  51. // }
  52. // }
  53. //}
  54. //if num < 0 {
  55. // for j < k {
  56. // j++
  57. // if nums[j] != nums[j-1] {
  58. // break
  59. // }
  60. // }
  61. //}
  62. }
  63. }
  64. }
  65. return ret
  66. }