lc-go/solutions/0/q15/solution.go
2025-12-23 19:00:11 +09:00

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