三数之和
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
}