leetcode 第15题(三数之和)

339 阅读1分钟

给定一组整数,求出其中所有 能使和为0的三个数,并输出这些三个数的所有组合(不能有重复结果)


例:

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

返回:[[-1,-1,2 ],  [-1, 0, 1]]


解法:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result = []
        nums.sort()  
        '''将数组排序,在有序数组中,每次选取最左端的数,计算出剩余两数的和作为目标值
           在剩余的数中,每次从两端扫描,找出可能为目标值的两数,满足情况后,将其加入结果集中
           找到存在的结果后,通过判断左右两端下一个遍历的值是否和当前值相等来跳过重复结果情况
        '''
        i = 0
        while i < len(nums) - 2:
            if nums[i] > 0: #当第一个数为大于0的数时,不存在和为0的组合,直接跳过
                return result
            target = 0 - nums[i]
            left = i + 1
            right = len(nums) - 1
            
            while left < right:
                calc = nums[left] + nums[right]
                if target == calc:
                    result.append([nums[i], nums[left], nums[right]])
                    left += 1
                    right -= 1
                    while left < right and nums[left - 1] == nums[left]: #跳过重复的nums[left]
                        left += 1
                    while left < right and nums[right] == nums[right + 1]: #跳过重复的nums[right]
                        right -= 1
                elif calc < target:
                    left += 1
                else:
                    right -= 1
            while i < len(nums) - 2 and nums[i + 1] == nums[i]:  #跳过重复的nums[i]
                i += 1
            i += 1
        return result