leetcode学习笔记(15.三数之和)

122 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本题考察数组相关知识,为中等题15.三数之和

15.三数之和

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

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

示例 1:

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

示例 2:
输入:nums = []
输出:[]

示例 3:
输入:nums = [0]
输出:[]

提示:

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

代码

会超时
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result = []
        lens = len(nums)
        
        for i in range(lens):
            for j in range(i+1,lens):
                a = nums[j+1:]
                if -(nums[i]+nums[j]) in a:
                    result.append([nums[i],nums[j],-(nums[i]+nums[j])])
                    
        re1 = []
        for re in result:
            re.sort()
            if re not in re1:
                re1.append(re)
                
        return re1

双指针
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums) < 3:
            return []
        nums.sort()
        res = []
        for i in range(len(nums)):
            if nums[i] > 0:
                return res #如果剩下的数列第一个数字就大于0
            if i > 0 and nums[i] == nums[i-1]:
                continue #避免重复
            else:
                L = i + 1
                R = len(nums) - 1
                while L < R:
                    if nums[i] + nums[L] + nums[R] == 0:
                        res.append([nums[i], nums[L], nums[R]])
                        while L < R and nums[L] == nums[L+1]:#找到最后一个和nums[L]相同的数
                            L += 1
                        while L < R and nums[R] == nums[R-1]:
                            R -= 1
                        L += 1
                        R -= 1
                    elif nums[i] + nums[L] +nums[R] < 0: 
                        L += 1
                    elif nums[i] + nums[L] +nums[R] > 0: 
                        R -= 1
                        
        return res

解析

我的小白思路当然是想到三层for循环,但是超时了,果然不是那么简单的,中等题就是有点难度哈。 具体方法:
1.先sort排个序,用for循环
2.循环里把L指向第一个数,R指向最后一个数
3.套一个while循环,如果nums[i] + nums[L] + nums[R] == 0,则放进去,然后L和R分别向后向前去找不重复的第一个数,接着while循环
4.for循环结束则输出

来源:力扣(LeetCode) 链接:leetcode.cn/problems/3s… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。