力扣刷题:15.三数之和

自己思路:

1、分别从前、后遍历i,j,再另一个k遍历两个元素之间的值

2、判断是否有满足与nums[i]+nums[j]+nums[k]=0的元素,有的话加入列表mid

3、再将mid加入最后总的列表result

4、再对result去重

导致三重循环、还要额外进行去重,时间超出限制

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        i = 0
        len_nums = len(nums)
        j = len_nums - 1
        result=[]
        mid=[]
        while i < len_nums-2:
            j = len_nums - 1
            while j > i:
                flag = 0 - (nums[i]+nums[j])
                k = i+1
                while k < j and k > i:
                    mid = []
                    # print("nums[i]:{},nums[j]:{},nums[k]:{}".format(nums[i],nums[j],nums[k]))
                    if nums[k]==flag:
                        mid.append(nums[i])
                        mid.append(nums[j])
                        mid.append(nums[k])
                        # print(mid)
                        result.append(mid)
                    k+=1
                j-=1
            i+=1
        print(result)

        # 去重
        one={}
        for x in result:
            if str(sorted(x)) in one:
                continue
            else:
                one[str(sorted(x))]=sorted(x)
        print(one)
        final_result=list(one.values())
        print(final_result)
        return final_result

看了一个精选解答:通过排序,减少相同值进行重复遍历;根据他的思路,自己理了一下,然后跟着写了代码,但是还是没有他的代码执行用时少,希望自己能学到东西,看了还是会有似懂非懂的感觉。

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 1、排序
        nums=sorted(nums)
        # 记录三元组
        i=0
        len_nums=len(nums)
        j=len_nums-1
        k=0
        result=[]
        while k<len_nums-2:
            # 如果第一个数>0
            if nums[k]>0:
                break
            # 如果当前数字与上一个数相同,则该数字已查找过
            elif k>0 and nums[k]==nums[k-1]:
                k+=1
                continue
            # 其他情况
            else:
                i=k+1
                j=len_nums-1
                while i<j:
                    flag=0-nums[k]
                    if nums[i]+nums[j]>flag:
                        j-=1
                        while i<j and nums[j]==nums[j+1]:
                            j-=1
                    elif nums[i]+nums[j]<flag:
                        i+=1
                        while i<j and nums[i]==nums[i-1]:
                            i+=1
                    else:
                        mid=[]
                        mid.append(nums[k])
                        mid.append(nums[i])
                        mid.append(nums[j])
                        result.append(mid)
                        i+=1
                        j-=1
                        while i<j and nums[j]==nums[j+1]:
                            j-=1
                        while i<j and nums[i]==nums[i-1]:
                            i+=1
            k+=1
        print(result)
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值