LeetCode-15-三数之和

博客围绕一道算法题展开,作者先给出个人错误解法,将数组按正、负、0分类处理,后学习官方排序+双指针解法,认为自己方法更优。作者给出修改后的正确个人解,虽通过多数测试用例,但倒数第三个超时,打算后续再优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

个人错误解

思想是先对数组进行重新构造归类,将正数负数0分开处理。这样就会出现三种情况:

  • 一正一负的相反数加上0
  • 三个0
  • 两正一负
  • 两负一正
nums = [-1,0,1,2,-1,-4,-2,-3,3,0,4]
if len(nums)<3: print('return []')
Negnums=[]
Posnums=[]
Zero=0
ans=[]
for i in nums:
    if i>0:
        Posnums.append(i)
    elif i<0:
        Negnums.append(i)
    else:
        Zero+=1
Posnums.reverse()
Negnums.reverse()
if Zero>2: ans.append([0,0,0])
if Zero>0:      #一正一负加上0的情况
    for i in set(Negnums):
        j=0
        while j<len(Posnums):
            if i+Posnums[j]==0:
                ans.append([i,0,Posnums[j]])
                j=len(Posnums)
            j+=1
for i in range(len(Negnums)-1):  #两负一正
    j=1
    while i+j<len(Negnums):
        k=0
        while k<len(Posnums):
            print([Negnums[i],Negnums[i+j],Posnums[k]])
            if Negnums[i]+Negnums[i+j]+Posnums[k]==0:
                print('ok')
                ans.append([Negnums[i],Negnums[i+j],Posnums[k]])
                k=len(Posnums)
            k+=1
        j+=1
for i in range(len(Posnums)-1): #两正一负
    j=1
    while i+j<len(Posnums):
        k=0
        while k<len(Negnums):
            print([Posnums[i],Posnums[i+j],Negnums[k]])
            if Posnums[i]+Posnums[i+j]+Negnums[k]==0:
                print('ok')
                ans.append([Posnums[i],Posnums[i+j],Negnums[k]])
                k=len(Negnums)
            k+=1
        j+=1
ANS= []
for id in ans:
    if id not in ANS: # 当id不在news_list中就添加,在就不添加,达到去重的目的
        ANS.append(id)
print(ANS)
        
#为了减少复杂度,还有点问题     

早知道直接暴力算了,今天不在状态,老是报错,心态没了。方法本身就不是很好,还是学学大佬的解吧。
在这里插入图片描述

官方解

仔仔细细看完了官方给出的排序+双指针的解法,然后思想是一样的,但是感觉我的方法虽然没有官方给的简洁,但比官方更加优化。官方给出的解循环中会出现三个正数或者三个负数相加不满足的运算,而我的就不会。

画解算法

我没仔细看,我还是想按照自己思路搞定这个题,有兴趣可以看看

修改后的正确个人解

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums)<3: return []
        Negnums=[]
        Posnums=[]
        Zero=0
        ans=[]
        for i in nums:
            if i>0:
                Posnums.append(i)
            elif i<0:
                Negnums.append(i)
            else:
                Zero+=1
        Posnums.sort()
        Negnums.sort()
        print('Posnums:',Posnums)
        print('Negnums:',Negnums)
        if Zero>2: ans.append([0,0,0])
        if Zero>0:      #一正一负加上0的情况
            for i in set(Negnums):
                j=0
                while j<len(Posnums):
                    if i+Posnums[j]==0:
                        ans.append([i,0,Posnums[j]])
                        j=len(Posnums)
                    j+=1
                    
        for i in range(len(Negnums)-1):  #两负一正
            j=1
            while i+j<len(Negnums):
                k=0
                while k<len(Posnums):
                    if Negnums[i]+Negnums[i+j]+Posnums[k]==0:
                        ans.append([Negnums[i],Negnums[i+j],Posnums[k]])
                        k=len(Posnums)
                    k+=1
                j+=1
        for i in range(len(Posnums)-1): #两正一负
            j=1
            while i+j<len(Posnums):
                k=0
                while k<len(Negnums):
                    if Posnums[i]+Posnums[i+j]+Negnums[k]==0:
                        ans.append([Posnums[i],Posnums[i+j],Negnums[k]])
                        k=len(Negnums)
                    k+=1
                j+=1
        ANS= []
        for id in ans:
            if id not in ANS: 
                ANS.append(id)
        return ANS

也不知道修改了什么,思路是没变的,318个例子,前面的正常例子都是通过了,证明代码没问题。
但是力扣不当人啊,倒数第三个测试用例超时。
在这里插入图片描述
我也是醉了。
我感觉我的代码带能优化,已经十点半了,有机会再优化吧。
权限&免责&交流声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值