leetcode+三数之和 小安晋升分享(第15题哦)

三数之和

今天是小安开始Leetcode刷题的第15题,正文开始ing?

题目描述

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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

方法:类快速排序

思路

开始的时候想使用嵌套循环来做,很悲伤地超时了。代码附下,作为经验
之后就得解决三重循环问题以及重复值问题
a.先对列表进行排序
b.给定第一个数nums[i]
c.从i之后首尾两端开始考虑三个元素累加值:若summ<0,则需要找更大的值,left++;
若summ>0,则需要找小一点的值,right–;若summ==0,则判断是否重复,before1和before2分别记录之前符合要求的首尾值,flag记录是否已经添加过

超时代码

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result=[]
        nums.sort()
        if len(nums)<3:
            return []
        le=len(nums)
        for i in range(le): 
            for j in range(i+1,le):                
                for x in range(j+1,le):
                    if nums[i]+nums[j]+nums[x]==0:
                        result.append([nums[i],nums[j],nums[x]])
                        break
                while j<le-1 and nums[j]==nums[j+1]:
                    j+=1
            while i<le-1 and nums[i]==nums[i+1]:
                    i+=1
                
        res=[]        
        for letter in result:#去除重复元素
            if letter not in res:
                res.append(letter)      
        return res

代码实现

【Python实现】

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result=[]
        nums.sort()
        if len(nums)<3:
            return []
        le=len(nums)
        before1=0
        before2=0
        flag=-1
        for i in range(le-2): 
            if nums[i]>0:
                break
            if i>0 and nums[i]==nums[i-1]:
                continue
            left=i+1
            right=le-1
            while left<right:
                summ=nums[left]+nums[right]+nums[i]
                if summ<0:
                    left+=1
                elif summ>0:
                    right-=1
                else:#summ=0
                    if flag==1 and before1==nums[left] and before2==nums[right]:#已存在
                        left+=1
                        continue
                    result.append([nums[i],nums[left],nums[right]])
                    left+=1
                    before1=nums[left]
                    before2=nums[right]
                    flag=1      
        return result     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值