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