15. 三数之和

15. 三数之和 #

题目地址 #

解题思路 #

具体实现 #

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)
}