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

文章目录

    • 一、题目
    • 二、解法:数组排序 + 双指针

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

一、题目

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

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

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

数组排序 + 双指针的 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
                    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

你可能感兴趣的:(数据结构和算法,LeetCode,leetcode,算法)