Leetcode 15. 三数之和

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

注意:答案中不可以包含重复的三元组。

 

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],



满足要求的三元组集合为:

[

  [-1, 0, 1],

  [-1, -1, 2]

]

**难度**: Medium

**标签**: 数组、 双指针、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:972 ms, 在所有 Python3 提交中击败了61.82% 的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了96.71% 的用户

解题思路:
    双指针法,固定一个值,然后双指针遍历其余值
    先对列表进行排序
    i 循环遍历列表,作为固定值
    l, r 作为左右指针,分别去遍历剩余值
    具体实现见代码注释
"""
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        now = None  # 用于记录固定值,判断是否重复
        result = []
        for i in range(n):
            if nums[i] == now:  # 遇到重复的值,跳过
                continue
            now = nums[i]
            if nums[i] > 0: # 如果当前值大于0,则之后的和绝对大于0,跳出(因为已排序)
                break
            l, r = i+1, n-1 # 左右指针
            while l0, 右指针左移
                    r -= 1
        return result