15.三数之和

15.三数之和_第1张图片
参考官方解析,解释了排序+双指针的解法。
15.三数之和_第2张图片
15.三数之和_第3张图片
15.三数之和_第4张图片
代码参考排序 + 双指针,逐行解释
代码:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nlen = len(nums)
        res = []
        if nlen < 3:
            return res
        
        nums.sort()

        for pivot in range(nlen): # 固定第一个值, 向后遍历

            if nums[pivot] > 0:  # 如果最小的数都大于0,那么后面找出的三数和不可能为0(已排序)
                return res
            if pivot > 0 and nums[pivot] == nums[pivot - 1]: # 跳过重复的数值
                continue

            L = pivot + 1 # 双指针的左边界 第二个值成递增趋势
            R = nlen - 1 # 双指针的右边界 第三个值成递减趋势
            
            while L < R :
                if nums[pivot] + nums[L] + nums[R] == 0:
                    res.append([nums[pivot], nums[L], nums[R]])
                    L += 1
                    R -= 1

                    while L < R and nums[L] == nums[L - 1]: # 跳过重复数值
                        L += 1
                    while L < R and nums[R] == nums[R + 1]:
                        R -= 1
                elif nums[pivot] + nums[L] + nums[R] > 0: # 第三个值大了些
                    R -= 1
                else: # 第二个值小了些
                    L += 1
                    
        return res

你可能感兴趣的:(leetcode,算法,职场和发展)