难度:中等 题目来源:力扣(LeetCode) https://leetcode-cn.com/problems/3sum

    说明:
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
    注意答案中不可以包含重复的三元组。

    示例:
    给定数组 nums = [-1, 0, 1, 2, -1, -4]
    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    解法:

    1. import "sort"
    2. func threeSum(nums []int) [][]int {
    3. ret := make([][]int, 0, len(nums))
    4. if len(nums) < 3 {
    5. return ret
    6. }
    7. sort.Ints(nums)
    8. for index, value := range nums {
    9. if index > len(nums)-3 || value > 0 || (value+nums[index+1]) > 0 {
    10. break
    11. }
    12. if index > 0 && value == nums[index-1] {
    13. continue
    14. }
    15. leftIndex, rightIndex := index+1, len(nums)-1
    16. for leftIndex < rightIndex {
    17. leftValue, rightValue := nums[leftIndex], nums[rightIndex]
    18. if leftIndex != index+1 && leftValue == nums[leftIndex-1] {
    19. leftIndex++
    20. continue
    21. }
    22. if rightIndex != len(nums)-1 && rightValue == nums[rightIndex+1] {
    23. rightIndex--
    24. continue
    25. }
    26. v := value + leftValue + rightValue
    27. if v > 0 {
    28. rightIndex--
    29. } else if v < 0 {
    30. leftIndex++
    31. } else {
    32. ret = append(ret, []int{value, leftValue, rightValue})
    33. leftIndex++
    34. rightIndex--
    35. }
    36. }
    37. }
    38. return ret
    39. }