65 lines
1.1 KiB
Go
65 lines
1.1 KiB
Go
package q15
|
|
|
|
import "slices"
|
|
|
|
func sortAndDedup3(nums []int) []int {
|
|
slices.Sort(nums)
|
|
head, dup := 0, 0
|
|
for i := 1; i < len(nums); i++ {
|
|
if nums[i] == nums[head] {
|
|
dup++
|
|
} else {
|
|
dup = 0
|
|
}
|
|
if dup < 3 {
|
|
head++
|
|
nums[head] = nums[i]
|
|
}
|
|
}
|
|
return nums[:head+1]
|
|
}
|
|
|
|
func threeSum(nums []int) [][]int {
|
|
nums = sortAndDedup3(nums)
|
|
ret := [][]int{}
|
|
|
|
appendResult := func(a, b, c int) {
|
|
triplet := []int{a, b, c}
|
|
if len(ret) > 0 && slices.Equal(triplet, ret[len(ret)-1]) {
|
|
return
|
|
}
|
|
ret = append(ret, triplet)
|
|
}
|
|
|
|
for i := 0; i < len(nums)-2; i++ {
|
|
if nums[i] > 0 {
|
|
break
|
|
}
|
|
wants := -nums[i]
|
|
l, r := i+1, len(nums)-1
|
|
for l < r {
|
|
for l < r && nums[l]+nums[r] > wants {
|
|
r--
|
|
}
|
|
if l < r && nums[l]+nums[r] == wants {
|
|
appendResult(nums[i], nums[l], nums[r])
|
|
r--
|
|
}
|
|
for l < r && nums[l]+nums[r] < wants {
|
|
l++
|
|
}
|
|
if l < r && nums[l]+nums[r] == wants {
|
|
appendResult(nums[i], nums[l], nums[r])
|
|
l++
|
|
}
|
|
}
|
|
|
|
// skip same numbers
|
|
for ; i < len(nums)-2 && nums[i] == nums[i+1]; i++ {
|
|
}
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
var _ = threeSum
|