做好每一件事,读好每一本书,天道酬勤
三数之和
2022-04-08 / 2 min read

三数之和,这个题目做过了很多次但是还是有点不清楚,今天重新做了一下。

题目解析

这个题目理解起来还是很简单的,也就是在一个数组里面我们将三个数字加起来等于0那么记录一下就可以了,所以最后的输出肯定是一个二维数组。首先我们要做的事情就是找出来这些数字。
这里我们使用迭代的方式,我们首先将数组进行排序,然后使用双指针的方式将数字找出来,首先我们先取出一个数字,然后我们就将一个三个数字的题目转换成一个两个数字的题目。
然后我们在找两个数字的时候,因为我们的数组是进行了排序的,所以我们就将情况分解出来,也就是说如果最后三个数字的和大于零那么就是说明右边界太大了,那么我们就调整右边界,同理我们可以调整左边界。
这里需要注意一个点,也就是我们在最后的结构,我们不要重复的,所以相同的数字我们就要将它排除,这里我们有三段代码做了这件事情。

解题源码

func threeSum(nums []int) [][]int {
  sort.Ints(nums)
  return TreeNum(nums)
}


func TreeNum(nums []int)[][]int{
   res := make([][]int,0)
   for i := 0;i<len(nums)-2;i++{
       n1 := nums[i]
       if n1 > 0{
           break
       }
       if i > 0 && n1 == nums[i-1]{
           continue
       }

       l,r := i+1,len(nums)-1
       for l < r{
                n2 ,n3 := nums[l],nums[r]
                if n1+n2+n3 == 0 {
                    res = append(res,[]int{n1,n2,n3})
                    for l<r && nums[l] == n2{
                        l++
                    }
                    for l<r && nums[r] == n3{
                        r--
                    }
                }else if n1+n2+n3 < 0{
                    l++
                }else{
                    r--
                }
       }
   }
   return res
}