image.png

    三数值和
    定义三个指针start,end,index。大循环为index,小循环为start去重:
    一、对start和end的去重是碰到重复即进行start++或end—。
    二、对index的去重并不能简单的index++,我看到有些题解这么做,跑了一遍后发现有bug会漏解。比如对数组[0,-1,-1,2],index循环到第二个-1处时,直接跳过的话,会忽略[-1,-1,2]的解。我的处理是将start定位到index-1的位置,这样只需要对end指针进行移位来遍历所有情况

    1. package main
    2. import (
    3. "fmt"
    4. "sort"
    5. )
    6. func threeSum(nums []int) [][]int {
    7. // 排序
    8. sort.Ints(nums)
    9. var resultList [][]int
    10. var addSum int
    11. var index,left,right int
    12. for index=1;index<len(nums)-1;index++{
    13. left = 0
    14. right = len(nums)-1
    15. for left<index&&index<right{
    16. addSum = nums[left]+nums[index]+nums[right]
    17. if addSum ==0 {
    18. resultList = append(resultList,[]int{nums[left],nums[index],nums[right]})
    19. left++
    20. right--
    21. }else if addSum>0 {
    22. right--
    23. }else {
    24. left++
    25. }
    26. }
    27. }
    28. return resultList
    29. }
    30. func main() {
    31. fmt.Println(threeSum([]int{-1,0,1,2,-1,-4}))
    32. fmt.Println(threeSum([]int{0,0,0,0}))
    33. }

    这种会出现重复,难点在去重

    1. package main
    2. import (
    3. "fmt"
    4. "sort"
    5. )
    6. func threeSum(nums []int) [][]int {
    7. // 排序
    8. var res [][]int
    9. sort.Ints(nums)
    10. for i:=0;i<len(nums);i+=1{
    11. // 排序 可以去重 重复值没有必须在执行一遍了,也就做到了去重
    12. if i>0&&nums[i]==nums[i-1] {
    13. continue
    14. }
    15. l := i+1
    16. r := len(nums)-1
    17. for l<r{// 移动左右坐标点
    18. tmp := nums[i]+nums[l]+nums[r]
    19. if tmp ==0 {
    20. res = append(res,[]int{nums[i],nums[l],nums[r]})
    21. l+=1
    22. r-=1
    23. // 数字相同 去重
    24. for l<r&&nums[l]==nums[l-1] {
    25. l+=1
    26. }
    27. for l<r&&nums[r]==nums[r+1] {
    28. r-=1
    29. }
    30. }else if tmp>0 {// 如果和大说明需要取更小的值
    31. r-=1
    32. }else {// 如果和小于0 说明需要取更大的值
    33. l+=1
    34. }
    35. }
    36. }
    37. return res
    38. }
    39. func main() {
    40. fmt.Println(threeSum([]int{-1,0,1,2,-1,-4}))
    41. fmt.Println(threeSum([]int{0,0,0,0}))
    42. fmt.Println(threeSum([]int{-2,0,3,-1,4,0,3,4,1,1,1,-3,-5,4,0}))
    43. }