【LeetCode】15,三数之和。 难度等级:中等。左右双指针的思路yyds,本题值得经常温习。


本题与 两数之和类似,是非常经典的面试题,但是做法不尽相同。这两道题都值得深入研究,多次回顾。

一、题目

在这里插入图片描述

二、解法:数组排序 + 双指针

如果直接用暴力枚举,即三重循环,会执行超时。

数组排序 + 双指针的 code 如下:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        length=len(nums)
        nums.sort()
        ans=[]
        for i in range(length-2):
            # 由于nums升序,所以当nums[i]>0时,不然不可能出现三数之和为0的情况
            if nums[i]>0:
                break

            # 防止ans中包含重复的三元组,continue表示跳出本次循环
            if i>0 and nums[i]==nums[i-1]:
                continue

            left=i+1
            right=length-1
            while left<right:
                sumTemp=nums[i]+nums[left]+nums[right]
                if sumTemp==0:
                    ans.append([nums[i],nums[left],nums[right]])
                    left+=1
                    right-=1

                    # 这里必须要加 left<right 的判断,否则在 nums=[0,0,0,0] 这种情况下,left会一直增大直到数组越界
                    while left<right and nums[left]==nums[left-1]:
                        left+=1
                    while left<right and nums[right]==nums[right+1]:
                        right-=1
                elif sumTemp<0:
                    left+=1
                    while left<right and nums[left]==nums[left-1]:
                        left+=1
                else:
                    right-=1
                    while left<right and nums[right]==nums[right+1]:
                        right-=1
        return ans

猜你喜欢

转载自blog.csdn.net/qq_43799400/article/details/131036806
今日推荐