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

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

示例

输入:nums = [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

解析

1)本题的难点在于去重,而且在过程中去重,最后去重就会超时;

2)首先将数组排序,从第一个数开始遍历,序号记为i;

3)然后定义两个指针,令左指针 l=i+1,右指针 r=n-1,当 l<r 时,while循环;

4)如果 nums[i] + nums[l] + nums[r] == 0,则记录这个解;

5)判断 nums[l] 和 nums[l+1],nums[r] 和 nums[r-1],如果相等,则移动指针,排除重复解;

6)若和大于 0,说明 nums[r] 太大,r 左移;若和小于 0,说明 nums[l] 太小,l 右移;

代码示例

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        lst = []
        n = len(nums)
        for i in range(n):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            l = i+1
            r = n-1
            while l<r:
                s = nums[i] + nums[l] + nums[r]
                if s == 0:
                    lst.append([nums[i], nums[l], nums[r]])
                    while l < r and nums[l] == nums[l+1]:
                        l += 1
                    while l < r and nums[r] == nums[r-1]:
                        r -= 1
                    l += 1
                    r -= 1
                elif s < 0:
                    l += 1
                else:
                    r -= 1
        return lst

执行用时:628 ms, 在所有 Python3 提交中击败了 75.65% 的用户.

本文为 陈华 原创,欢迎转载,但请注明出处:http://edu.ichenhua.cn/read/418