package main
import (
"fmt"
"sort"
)
func threeSum(nums []int) [][]int {
sort.Ints(nums)
res := [][]int{}
// 找出 a + b + c = 0
// a = nums[i], b = nums[left], c = nums[right]
for i := 0; i < len(nums)-2; i++ {
// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
n1 := nums[i]
if n1 > 0 {
return res
}
// 去重 a
if i > 0 && n1 == nums[i-1] {
continue
}
left, right := i+1, len(nums)-1
for left < right {
n2, n3 := nums[left], nums[right]
if n1+n2+n3 == 0 {
res = append(res, []int{n1, n2, n3})
// 去重逻辑应该放在找到一个三元组之后,对 b 和 c 去重
for left < right && nums[left] == n2 {
left++
}
for left < right && nums[right] == n3 {
right--
}
} else if n1+n2+n3 < 0 {
left++
} else {
right--
}
}
}
return res
}
func main() {
ret := threeSum([]int{-1, 0, 1, 2, -1, -4})
fmt.Println(ret)
}