15. 三数之和

func threeSum(nums []int) [][]int {

    // 从小到大排序,如果大于0就不用找了
    sort.Ints(nums)

    res := [][]int{}
    for i:=0; i<len(nums)-2; i++ {
        // 结束查找
        if nums[i] > 0 {
            break
        }

        // 在数组[i+1:] 双指针 查找两数之和
        target := -nums[i]
        left := i+1
        right := len(nums)-1
        if i == 0 || nums[i]!=nums[i-1] { // 过滤重复的
            for left<right {
                if nums[left]+nums[right] == target {
                    res = append(res, []int{nums[i], nums[left], nums[right]})

                    // 重复元素过滤
                    for left<right && nums[left]==nums[left+1]{
                        left++
                    }
                    for left<right && nums[right]==nums[right-1]{
                        right--
                    }
                    // 指向下一个
                    left++
                    right--

                } else if nums[left]+nums[right]<target {
                    left++
                } else {
                    right--
                }
            }
        }
    }
    return res
}
posted @ 2024-06-14 11:05  gdut17_2  阅读(15)  评论(0)    收藏  举报