三数之和的golang实现

时间:2023-03-09 08:14:00
三数之和的golang实现

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-, , , , -, -],

满足要求的三元组集合为:
[
[-, , ],
[-, -, ]
]
我们来看一下图:

我们先对数组排序,得到如下图的结果

三数之和的golang实现

我们要计算a+b+c=0,先对数组循环得到a,然后b就是a的索引+1的值,c是len(nums)-1的值。

三数之和的golang实现

如果a+b+c<0的是时候,说明太小了,那b就往右挪一下

反之,如果a+b+c>0,那么说明太大了,c就往左挪一下

核心代码:
func threeSum2(nums []int) [][]int {
//先对数组排序
sort.Ints(nums)
result := [][]int{}
for i := ; i < len(nums)-; i++ {
if i > && nums[i] == nums[i-] {
continue
}
j := i +
z := len(nums) -
for z > j {
b := nums[j]
c := nums[z]
if nums[i]+b+c > {
z--
} else if nums[i]+b+c < {
j++
} else {
item := []int{nums[i], b, c}
result = append(result, item)
for j < z && nums[j] == nums[j+] {
j++
}
for j < z && nums[z] == nums[z-] {
z--
}
j++
z--
}
}
}
return result
}

去重技巧:

  • 在循环一开始的时候,就判断当前位的值是否跟上一位一样,一样的话就跳过
  • 在把符合条件的值存进数组的时候,判断b的下一位是不是和b一样,判断c的下一位是不是和c一样,一样的话那就直接跳过