题目
个人错误解
思想是先对数组进行重新构造归类,将正数负数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个例子,前面的正常例子都是通过了,证明代码没问题。
但是力扣不当人啊,倒数第三个测试用例超时。
我也是醉了。
我感觉我的代码带能优化,已经十点半了,有机会再优化吧。
权限&免责&交流声明